poj 2488 A Knight's Journey( dfs )

题目:http://poj.org/problem?id=2488

题意:

给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径。

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<stack>
 6 #include<queue>
 7 #include<iomanip>
 8 #include<cmath>
 9 #include<map>
10 #include<vector>
11 #include<algorithm>
12 using namespace std;
13 
14 struct node
15 {
16     int x,y;
17 }q[30]; //记录路径
18 int p,c;
19 int vis[300][30];
20 int d[10][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};//顺序很重要,不能改变
21 int dfs(int i,int j,int step)
22 {
23     vis[i][j]=1;
24     q[step].x=i;
25     q[step].y=j;
26     if(step==p*c) return 1;
27     for(int k=0; k<8; k++)
28     {
29         int a=i+d[k][0];
30         int b=j+d[k][1];
31         if(!vis[a][b]&&a>=1&&a<=p&&b>=1&&b<=c)
32         if(dfs(a,b,step+1))
33         return 1;
34     }
35     vis[i][j]=0;
36     return 0;
37 }
38 int main()
39 {
40     int t,i;
41     cin>>t;
42     for(i=1; i<=t; i++)
43     {
44         memset(vis,0,sizeof(vis));
45         cin>>p>>c;
46         printf("Scenario #%d:\n",i);
47         if(dfs(1,1,1))
48         {
49             for(int j=1; j<=p*c; j++)
50             printf("%c%d",q[j].y+64,q[j].x);
51             cout<<endl<<endl;
52         }
53         else
54         cout<<"impossible"<<endl<<endl;
55     }
56     return 0;
57 }

 

posted @ 2013-08-27 16:42  水门  阅读(173)  评论(0编辑  收藏  举报