poj 2488A Knight's Journey

 1 #include<cstdio>
 2  #include<cstring>
 3  #define MAXN 26
 4  using namespace std;
 5  
 6  int dx[]={-1,1,-2,2,-2,2,-1,1};
 7  int dy[]={-2,-2,-1,-1,1,1,2,2};
 8  int vis[MAXN][MAXN];
 9  int lu[MAXN][MAXN];
10  int p,q;
11  bool flag;
12  
13  void dfs(int i,int j,int step)
14  {
15      int x,y;
16      vis[i][j]=step;
17      if(step==p*q)
18      {
19         flag=true;
20         return ;
21      }
22      for(int m=0; m<8; m++)
23      {
24          x=i+dx[m];
25          y=j+dy[m];
26          if((x>=0&&x<p&&y>=0&&y<q)&&!vis[x][y])
27          {
28              lu[step][0]=x;
29              lu[step][1]=y;
30              dfs(x,y,step+1);
31              if(flag)return;
32              vis[x][y]=0;
33          }
34      }
35  }
36  int main()
37  {
38      int t,tt=0;
39      scanf("%d",&t);
40      while(t--)
41      {
42          tt++;
43          scanf("%d%d",&p,&q);
44          printf("Scenario #%d:\n",tt);
45          for(int i=0; i<p; i++)
46          {
47              for(int j=0; j<q; j++)
48              {
49                  int step=1;
50                  flag=false;
51                  memset(vis,0,sizeof(vis));
52                  memset(lu,0,sizeof(lu));
53                  lu[0][0]=i;
54                  lu[0][1]=j;
55                  dfs(i,j,step);
56                  if(flag)
57                  {
58                     for(int k=0; k<p*q; k++)
59                      printf("%c%d",lu[k][1]+'A',lu[k][0]+1);
60                     printf("\n\n");
61                     break;
62                  }
63              }
64              if(flag) break;
65          }
66          if(!flag) printf("impossible\n\n");
67      }
68      return 0;
69  }
70  
71  
View Code

 

posted @ 2013-08-26 18:33  null1019  阅读(196)  评论(0编辑  收藏  举报