poj2488_dfs_骑士
这也是一道DFS题,但写的还是不好。
题意:给一个矩阵r*c,求骑士可以从任意一点开始,是否能将这个矩阵中的各个点都走一遍。
分析:
1.字典顺序啊, lexicographical,当时也没管啥意思,唉。
2.不需要找到所有的情况,即如果遍历各点成功,就return ;
代码:
View Code
1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 using namespace std; 5 6 const int maxnum=27; //27,怎么会是8呢 7 bool array[maxnum][maxnum]; 8 int lenx[maxnum*maxnum]; 9 int leny[maxnum*maxnum]; 10 int ans,r,c,cur; 11 int lx[8]={-1,1,-2,2,-2,2,-1,1}; //字典顺序啊 12 int ly[8]={-2,-2,-1,-1,1,1,2,2}; 13 14 15 bool judge(int x,int y) 16 { 17 if(x>=1 && x<=r && y>=1 && y<=c && !array[x][y]) //老不加!array[][] 18 return true; 19 return false; 20 } 21 22 void dfs(int x,int y) 23 { 24 if(ans==r*c) return ; //终止条件 25 int i; 26 for(i=0;i<8;i++) 27 if(judge(x+lx[i],y+ly[i])) 28 { 29 array[x+lx[i]][y+ly[i]]=true; 30 ans++; 31 lenx[cur]=x+lx[i]; 32 leny[cur]=y+ly[i]; 33 cur++; 34 dfs(x+lx[i],y+ly[i]); 35 if(ans==r*c) return ; //没加,就会回溯 36 array[x+lx[i]][y+ly[i]]=false; 37 ans--; 38 cur--; 39 } 40 } 41 42 int main() 43 { 44 int num,i,j,k; 45 bool flag; 46 scanf("%d",&num); 47 for(k=1;k<=num;k++) 48 { 49 scanf("%d%d",&r,&c); 50 flag=false; 51 for(j=1;j<=c;j++) 52 { 53 for(i=1;i<=r;i++) 54 { 55 memset(array,false,sizeof(array)); 56 array[i][j]=true; //没加 57 ans=1; //初始错了 58 cur=1; 59 lenx[cur]=i; 60 leny[cur]=j; 61 cur++; 62 dfs(i,j); 63 if(ans==r*c) 64 { 65 flag=true; 66 break; 67 } 68 } 69 if(flag)break; 70 } 71 printf("Scenario #%d:\n",k); 72 if(j==c+1) 73 printf("impossible\n"); 74 else 75 { 76 for(i=1;i<r*c;i++) 77 printf("%c%d",leny[i]-1+'A',lenx[i]); 78 if(i==r*c) 79 printf("%c%d\n",leny[i]-1+'A',lenx[i]); 80 } 81 printf("\n"); 82 } 83 return 0; 84 }
这都是dfs的简单题啊,看来得狂练。
此题也是tju oj1702