思路:DFS,因为输入的i,j的顺序导致,方向向量中x是行编号,y是列编号。方向向量可能和直觉上不同。
错的
//int dx[8]={0,1,1,1,0,-1,-1,-1};
//int dy[8]={1,1,0,-1,-1,-1,0,1};
对的
int dx[]={-1,-1,0,1,1,1,0,-1};
int dy[]={0 , 1,1,1,0,-1,-1,-1};
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'const int N = 15;
int n,k;
int mp[N][N];
bool vis[N][N];
vector<int>ans;int dx[]={-1,-1,0,1,1, 1, 0,-1};
int dy[]={0 , 1,1,1,0,-1,-1,-1};//判断是否交叉
bool charge(int x,int y,int i){if(i%2)if(vis[x+dx[(i+1)%8]][y+dy[(i+1)%8]]&&vis[x+dx[(i-1)%8]][y+dy[(i-1)%8]])return true;return false;
}void dfs(int x,int y,int z,int count){if(x==n-1&&y==n-1&&count==n*n-1){for(auto it:ans)cout<<it;cout<<endl;exit(0);}for(int i=0;i<8;i++){int nx=x+dx[i];int ny=y+dy[i];//越界,访问情况,接龙,交叉需要判断if(nx>=0&&nx<=n-1&&ny>=0&&ny<=n-1&&vis[nx][ny]==false&&mp[nx][ny]==z&&!charge(x,y,i)){vis[nx][ny]=true;ans.push_back(i);count++;dfs(nx,ny,(z+1)%k,count);//回溯count--;vis[nx][ny]=false;ans.pop_back();}}
}void solve(){ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);cin>>n>>k;memset(mp, -1, sizeof(mp));for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>mp[i][j];}}//特殊情况if(n==1){cout<<-1;return;}vis[0][0]=true;//不能直接+1,k可能为1dfs(0,0,(mp[0][0]+1)%k,0);cout<<-1<<endl;
}signed main(){int T=1;while(T--)solve();return 0;
}
特殊情况
10 1
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
有输出结果
1 1
0
输出-1