典型的DFS题,骑士周游问题。
这题的关键在于字典序输出路径,要处理好搜索的顺序,另外需要注意的是,字母表示行,数字表示列。
1 #include <stdio.h> 2 #include <memory.h> 3 #define N 26 4 int dx[8]={-2,-2,-1,-1,1,1,2,2}; 5 int dy[8]={-1,1,-2,2,-2,2,-1,1}; 6 char vis[N][N],ok; 7 int n,m; 8 int ans[N]; 9 void dfs(int i,int j,int cnt) 10 { 11 int ni,nj,k; 12 ans[cnt]=i*m+j; 13 if(cnt+1==n*m&&!ok) 14 { 15 for(k=0;k<=cnt;k++) printf("%c%d",'A'+ans[k]/m,ans[k]%m+1); 16 ok=1; 17 printf("\n\n"); 18 return; 19 } 20 for(k=0;k<8;k++) 21 { 22 ni=i+dx[k],nj=j+dy[k]; 23 if(ni<0 || nj<0 || ni>=n || nj>=m || vis[ni][nj]) continue; 24 vis[ni][nj]=1; 25 dfs(ni,nj,cnt+1); 26 vis[ni][nj]=0; 27 } 28 } 29 int main() 30 { 31 int t,kase=0,i,j; 32 scanf("%d",&t); 33 while(t--) 34 { 35 scanf("%d%d",&m,&n); 36 printf("Scenario #%d:\n",++kase); 37 if(n*m==1){puts("A1\n");continue;} 38 ok=0; 39 memset(vis,0,sizeof(vis)); 40 vis[0][0]=1; 41 dfs(0,0,0); 42 if(!ok) puts("impossible\n"); 43 } 44 return 0; 45 }