2488: A Knight's Journey

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

熟悉的跳马问题dfs
注意按字典序 还有n m别弄反
 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 const int MaxN=30;
 7 const int dx[8]={-2,-2,-1,-11,12,2};
 8 const int dy[8]={-11,-22,-2,2,-1,1};
 9 
10 bool v[MaxN][MaxN];
11 int n,m,K;
12 int b[MaxN][2];
13 
14 bool pd(int x,int y)
15 {
16     if (x<0 || x>=|| y<0 || y>=|| v[x][y]==1return 0;
17     return 1;
18 }
19 
20 void write()
21 {
22     for (int i=0;i<m*n;i++)
23     {
24         printf("%c%d",char(b[i][0]+65),b[i][1]+1);
25     }
26     printf("\n");
27 }
28 
29 bool dfs(int x,int y,int t)
30 {
31     if (t==m*n)
32     {
33         write();
34         return 1;
35     }
36     for (int i=0;i<8;i++)
37     {
38         int xx=x+dx[i],yy=y+dy[i];
39         if (pd(xx,yy)==1)
40         {
41             b[t][0]=xx;
42             b[t][1]=yy;
43             v[x][y]=1;
44             if (dfs(xx,yy,t+1)==1return 1;
45             v[x][y]=0;
46         }
47     }
48     return 0;
49 }
50 
51 int main()
52 {
53     scanf("%d",&K);
54     for (int i=1;i<=K;i++)
55     {
56         scanf("%d%d",&m,&n);
57         printf("Scenario #%d:\n",i);
58         memset(v,0,sizeof(v));
59         memset(b,0,sizeof(b));
60         bool f=0;
61         for (int i=0;i<n;i++)
62         {
63             for (int j=0;j<m;j++)
64             {
65                 b[0][0]=i;
66                 b[0][1]=j;
67                 v[i][j]=1;
68                 if (dfs(i,j,1)==1)
69                 {
70                     f=1;
71                     break;
72                 }
73                 v[i][j]=0;
74             }
75             if (f==1break;
76         }
77         if (f==0) printf("impossible\n");
78     }
79     return 0;
80 }
81 
posted on 2012-10-05 09:54 Kiro 阅读(120) 评论(0)  编辑 收藏 引用 所属分类: poj

只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理