///DFS,回溯 ///因为要是字典序输出,所以1.搜索起点时必须从第一列开始,而且要从上到下 2.搜索骑士的 ///下一步时要注意顺序,设当前点为(x,y),则搜索顺序应该为(x-1,y-2),(x+1,y-2),(x-2,y-1) ///,(x+2,y-1),(x-2,y+1),(x+2,y+1),(x-1,y+2),(x+1,y+2) ///3.如果能有任意一点可以possible,他就可以到达(1,1),所以从(1,1)出发就不应 ///该会impossible #include<stdio.h> #include<string.h> int dire[8][2]={-1,-2,1,-2,-2,-1,2,-1,-2,1,2,1,-1,2,1,2}; int row[30],column[30]; int map[30][30],p,q,k,ends; int reach(int i,int j) { if(i<1||i>p) return 0; if(j<1||j>q) return 0; if(map[i][j]) return 0; return 1; } int dfs(int r,int c,int num) { int v_r=r,v_c=c,v_num=num; if(reach(r,c)==0) return 0; map[r][c]=1; v_num++; row[v_num]=r; column[v_num]=c; if(v_num==k) { ends=1; return 0; } int i; for(i=0;i<8;i++) { v_r=r+dire[i][0]; v_c=c+dire[i][1]; dfs(v_r,v_c,v_num); ///如果已经找到就退出 if(ends) return 0; } map[r][c]=0; return 0; } int main() { int i=1,cas,j; scanf("%d",&cas); while(cas--) { printf("Scenario #%d:/n",i++); scanf("%d%d",&p,&q); memset(map,0,sizeof(map)); ends=0; k=p*q; dfs(1,1,0); if(!ends) printf("impossible/n"); else { for(j=1;j<=k;j++) { printf("%c%d",column[j]+64,row[j]); } printf("/n"); } printf("/n"); } return 0; }