这题对于我来说,初次接触dfs的题目,还不是很熟练,对我来说主要是细节处理不到位,需要多加练习
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=11;
int n,k;
string path;
//枚举8个方向
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0,1,1,1,0,-1,-1,-1};
int g[N][N];
bool st[N][N];//st用来表示当前点有没有被使用过
bool edge[N][N][N][N];//用来判断交叉
bool dfs(int a, int b)
{
if(a==n-1 && b==n-1) return path.size()==n*n-1;
st[a][b]=true;//初始化当前(a,b)位置已经被走过了
//接下来枚举8个方向
for(int i=0;i<8;i++)
{
int x=a+dx[i];
int y=b+dy[i];
if(x>=n || x<0 || y>=n || y<0) continue;//判断边界
if(st[x][y]) continue;//判断该点是否被走过
if(g[x][y] != (g[a][b]+1)%k ) continue;//检查是否符合0,1,2...,k,0,1,2的顺序
if(i %2 && (edge[a][y][x][b] || edge[x][b][a][y])) continue;//判断是否有交叉
edge[a][b][x][y]=true;//表示(a,b)到(x,y)是一条正确的路径
path.push_back(i+'0');//把数字以字符的形式存入string
if(dfs(x,y)) return true;
path.pop_back();
edge[a][b][x][y]=false;
}
st[a][b]=false;
return false;
}
int main()
{
//读入数据
cin>>n>>k;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>g[i][j];
//判断路径是否存在
if(!dfs(0,0)) cout<<-1<<endl;
else cout<<path;
return 0;
}