题意:
给定一个 5×5 的方格,每个方格内有一个 0−9 之间的数,现在让你任意起点,向上下左右四个方向随便跳6次,求每次跳过的格子里的数字连起来形成的数一共有几个。每个格子可以跳无限次。数字可以不是6位数,意味着前面有0也是可以的。
思路:
深度优先搜索,枚举从每一个点开始跳6步的情况,每次跳到6步,就用map判断一下是否重复,不重复就把计数器++。
代码:
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
int a1[10][10], cnt;
map <int, bool> map1;
int b1[5] = {0,1,-1,0,0};
int b2[5] = {0,0,0,-1,1};
void dfs(int x, int y, int now, int step){
if(step == 6){
if(!map1[now]) map1[now] = 1, cnt ++;
return;
}
for(int i = 1; i <= 4; i ++){
int x1 = x+b1[i], y1 = y+b2[i];
if(x1<=5&&y1<=5&&x1>=1&&y1>=1){
dfs(x1, y1, now*10+a1[x1][y1], step+1);
}
}
}
int main(){
for(int i = 1; i <= 5; i ++)
for(int j = 1; j <= 5; j ++)
scanf("%d", &a1[i][j]);
for(int i = 1; i <= 5; i ++)
for(int j = 1; j <= 5; j ++)
dfs(i, j, a1[i][j], 1);
printf("%d", cnt);
return 0;
}