考虑到数据范围很小,直接把整个地图扩大两倍,每次走的步数也翻倍,这样对于两步之间的点可以直接在地图上标注走过了,下次走的时候,如果两点之间的点被标记过,则不能走
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
using namespace std;
const int N=25,INF=0x3f3f3f3f,P=131;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
int n,k;
int g[N][N];
int d[N][N];
int dx[8]={-2,-2,0,2,2,2,0,-2};
int dy[8]={0,2,2,2,0,-2,-2,-2};
int st[N][N];
bool dfs(int last,int x,int y,int cnt){
if(cnt==n*n)return true;
if(x==2*(n-1)&&y==2*(n-1))return false;
int nenum=(last+1)%k;
for(int i=0;i<8;i++){
int a=x+dx[i],b=y+dy[i];
if(a>=0&&a<2*n&&b<2*n&&b>=0&&d[a][b]==-1&&g[a][b]==nenum){
if(st[(a+x)/2][(b+y)/2])continue;
d[x][y]=i;
st[(a+x)/2][(b+y)/2]=1;
if(dfs(nenum,a,b,cnt+1))return true;
d[x][y]=-1;
st[(a+x)/2][(b+y)/2]=0;
}
}
return false;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)cin>>g[2*i][2*j];
}
memset(d,-1,sizeof d);
if(dfs(0,0,0,1)){
int x=0,y=0;
while(true){
int t=d[x][y];
cout<<t;
x=x+dx[t],y=y+dy[t];
if(x==2*(n-1)&&y==2*(n-1))break;
}
}
else cout<<-1;
}