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 }
View Code

 

 

 

posted on 2013-08-26 09:54  随风浪子的博客  阅读(110)  评论(0)    收藏  举报

导航