POJ_2488_A Knight's Journey
http://poj.org/problem?id=2488
题意:
给出棋盘的大小,判断马能否不重复的走过所有格;并记录下来按字典序排列的第一种路径;
经典的骑士游历问题,很明显是DFS一条路走到底吗。
注意事项:
1:题目要求要字典序输出,那么在搜索的时候按照下面的顺序得到的第一条道路就是
字典序。
2:行数为p是数字,列数为q是字母;
 
 
 
1 # include <stdio.h> 2 # include <string.h> 3 # include <algorithm> 4 using namespace std; 5 typedef struct node //记录位置留作输出 6 { 7 int row; 8 char col; 9 }location; 10 int p,q; //字母是q 11 int x,y,t,test; 12 bool chess['Z'+1][27]; 13 void next_step(int i,int j,int num) //i,j是骑士在棋盘中的位置 14 { 15 switch(num) //8个是骑士可以走的8个方向; 16 { 17 case 1: {x=i-1; y=j-2; break;} //注意这个尝试跳的顺序不能错 18 case 2: {x=i+1; y=j-2; break;} //因为题目要求是字典序lexicographically输出 19 case 3: {x=i-2; y=j-1; break;} //这个顺序错了,必定WA 20 case 4: {x=i+2; y=j-1; break;} 21 case 5: {x=i-2; y=j+1; break;} 22 case 6: {x=i+2; y=j+1; break;} 23 case 7: {x=i-1; y=j+2; break;} 24 case 8: {x=i+1; y=j+2; break;} 25 } 26 return ; 27 } 28 bool DFS(location *way,int i,int j,int step) 29 { 30 chess[i][j]=true; 31 way[step].row=i; 32 way[step].col=j; 33 if(step==way[0].row) 34 return true; 35 for(int k=1;k<=8;k++)//骑士最多可以跳8个方向 36 { 37 next_step(i,j,k); //下一步要走的坐标 38 int ii=x,jj=y; 39 if(!chess[ii][jj] && ii>=1 &&ii<=p && jj>='A' && jj<='A'+q-1) 40 if(DFS(way,ii,jj,step+1)) //如果跳的方向调用函数返回的是1,那么说明已找到返回1; 41 return true; 42 //刚开始这个if肯定是不执行的,只有找到最低层的时候满足step==way[0].row 43 //然后依次往上返回 true true。 44 } 45 chess[i][j]=false; //执行到这里说明前面的8步不符合要求, 46 return false; //即当前位置错误,擦除记录返回上一步继续。 47 } 48 void output() 49 { 50 printf("Scenario #%d:\n",t-test); 51 printf("impossible\n\n"); 52 return ; 53 } 54 int main() 55 { 56 int i,j,k; 57 scanf("%d",&test); 58 t=test; 59 while(test--) 60 { 61 memset(chess,false,sizeof(chess)); 62 scanf("%d%d",&p,&q); 63 if(p==1 && q==1) //缩小查找范围 64 { 65 printf("Scenario #%d:\n",t-test); 66 printf("A1\n\n"); 67 continue; 68 } 69 if(p*q>26 || p>=9 || q>=9 || p<=2 || q<=2) 70 { 71 output(); 72 continue; 73 } 74 location way[200]; 75 way[0].row=p*q; 76 bool flag=false; 77 for(j='A';j<'A'+q;j++) 78 { 79 for(i=1;i<=p;i++) 80 { 81 if(DFS(way,i,j,1)) 82 { 83 printf("Scenario #%d:\n",t-test); 84 for(k=1;k<=way[0].row;k++) 85 printf("%c%d",way[k].col,way[k].row); 86 printf("\n\n"); 87 flag=true; 88 break; 89 } 90 } 91 if(flag) 92 break; 93 } 94 if(!flag) 95 output(); 96 } 97 return 0; 98 }
 
                    
                 
 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号