POJ 2488 A Knight's Journey
标准的DFS,只不过是坑爹的字典序坑到了无数人……
题目大意:
给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径。
注意事项:
只有一条,那就是字典序!!!!!!!!
(对图片作者表示感谢)
这样搜出来的第一条路就是字典序最小的路了。
还有一条就是因为这条路可以走过棋盘上的所有的点,我们也就可以认为如果搜起点是A1 的这条路不成立的话就不用搜了,因为这条路到不了所有点也就是所有点到不了任一点了(自己想为什么……)。
下面是代码:
#include <stdio.h> #include <string.h> int p,q; bool map1[30][30]; int a[100][2],cut,x[8]= {-1,1,-2,2,-2,2,-1,1},y[8]= {-2,-2,-1,-1,1,1,2,2}; bool DFS (int i,int j,int stepnum) { map1[i][j]=true; a[stepnum][0]=i; a[stepnum][1]=j; if(stepnum==p*q) { return true; } for(int k=0; k<8; k++) { int ii=i+x[k]; int jj=j+y[k]; if(ii>=0&&ii<p&&jj>=0&&jj<q&&!map1[ii][jj]) { if(DFS(ii,jj,stepnum+1)) { return true; } } } map1[i][j]=false; return false; } int main() { int t,in=0,i,j; scanf("%d",&t); while(t--) { in++; scanf("%d%d",&p,&q); memset(map1,0,sizeof(map1)); if(p==1&&q==1) { printf("Scenario #%d:\n",in); printf("A1\n\n"); continue; } if(p*q>26||p>=9||q>=9||p<=2||q<=2) { printf("Scenario #%d:\n",in); printf("impossible\n\n"); continue; } int flat=0; for(i=0; i<q; i++) { if(DFS(0,i,1)) { printf("Scenario #%d:\n",in); for(int k=1; k<=p*q; k++) { printf("%c%d",a[k][1]+'A',a[k][0]+1); } printf("\n\n"); flat=1; break; } } if(!flat) { printf("Scenario #%d:\n",in); printf("impossible\n\n"); } } return 0; }