这道题也是我在zstu暑期集训的时候,搜索入门时碰到的经典题。
此题需要遍历棋盘上的所有点来确定骑士是否能走遍棋盘,所以显然是一道DFS题,需要注意的是输出路径必须是按字典序输出,这就要求我们在定义骑士行走方向按字典序来,。详情见下列代码的dir[8][2]数组。
这是AC代码:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,m,vis[30][30],sum,path[30][2],f; int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1}; void dfs(int x,int y) { vis[x][y]=1; sum++; path[sum][0]=x; path[sum][1]=y; if(sum==n*m) { for(int i=1;i<=sum;i++) printf("%c%d",path[i][0]+'A',path[i][1]+1); printf("\n"); f=1; return ; } for(int i=0;i<8;i++) { int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(xx<0||yy<0||xx>=n||yy>=m||vis[xx][yy]) continue; dfs(xx,yy); if(f) return; sum--; vis[xx][yy]=0; } } int main(void) { int t; scanf("%d",&t); int k; for(k=1;k<=t;k++) { if(k!=1) printf("\n"); scanf("%d%d",&m,&n); memset(vis,0,sizeof(vis)); sum=0; printf("Scenario #%d:\n",k); f=0; dfs(0,0); if(!f) printf("impossible\n"); } }