111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, and 212121 can be constructed. No other values are possible.
题意:在5*5的格子里,现在可以从任意点出发,上下左右移动,可以重复走过的点,每次只能走6步。问经过的格子中组成的6位数有多少种?
题解:遍历图中的每一个位置,然后从该位置开始暴力搜索,判断这个6位数之前出没出现过,记录走的步数,步数超过6步就停止
#include<iostream> #include<algorithm> #include<string.h> using namespace std; int path[6][6]; int ans; bool vis[10000005]; int dir_e[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; void dfs(int x,int y,int keep,int n){ if(keep==6){ if(!vis[n]){ vis[n]=1; ans++; } return; } for(int i=0;i<4;i++){ int sx=x+dir_e[i][0]; int sy=y+dir_e[i][1]; if(sx>=0&&sy>=0&&sx<5&&sy<5) dfs(sx,sy,keep+1,n*10+path[sx][sy]); } } int main(){ for(int i=0;i<5;i++) for(int j=0;j<5;j++) cin>>path[i][j]; ans=0; memset(vis,0,sizeof(vis)); for(int i=0;i<5;i++) for(int j=0;j<5;j++) dfs(i,j,0,path[0][0]); dfs(0,0,0,path[0][0]); cout<<ans<<endl; return 0; }