题意:让一个骑士走遍所给棋盘,按字典序输出。
题解:直接DFS但是需要回溯,我一开始没想到怎么按字典序跑,后来先定下来搜索的顺序,保证一旦搜出来就是字典序最小的,然后因为反正要遍历,干脆就从左上角开始。这样的字典序一定是最小的了。
#include <iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,flag; int vis[30][30]; int p1[30],p2[30]; int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1}; int check(int x,int y){ if(x<1||x>n)return 0; if(y<1||y>m)return 0; if(vis[x][y])return 0; if(flag)return 0; return 1; } void dfs(int x,int y,int deep){ //vis[x][y]=1; p1[deep]=x; p2[deep]=y; if(deep==n*m){ flag=1; return ; } int i,xx,yy; for(i=0;i<8;i++){ yy=y+dir[i][0]; xx=x+dir[i][1]; if(check(xx,yy)){ vis[xx][yy]=1; dfs(xx,yy,deep+1); vis[xx][yy]=0; } } } int main() { int i,t,icase=0; scanf("%d",&t); while(t--){ flag=0; memset(vis,0,sizeof(vis)); vis[1][1]=1; icase++; scanf("%d%d",&n,&m); dfs(1,1,1); printf("Scenario #%d:\n",icase); if(flag){ for(i=1;i<=m*n;i++)printf("%c%d",p2[i]+'A'-1,p1[i]); printf("\n\n"); } else printf("impossible\n\n"); } return 0; }