POJ2488(A Knight's Journey)

题目链接

典型的DFS题,骑士周游问题。

这题的关键在于字典序输出路径,要处理好搜索的顺序,另外需要注意的是,字母表示行,数字表示列。

View Code
 1 #include <stdio.h>
 2 #include <memory.h>
 3 #define N 26
 4 int dx[8]={-2,-2,-1,-1,1,1,2,2};
 5 int dy[8]={-1,1,-2,2,-2,2,-1,1};
 6 char vis[N][N],ok;
 7 int n,m;
 8 int ans[N];
 9 void dfs(int i,int j,int cnt)
10 {
11   int ni,nj,k;
12   ans[cnt]=i*m+j;
13   if(cnt+1==n*m&&!ok)
14   {
15     for(k=0;k<=cnt;k++) printf("%c%d",'A'+ans[k]/m,ans[k]%m+1);
16     ok=1;
17     printf("\n\n");
18     return;
19   }
20   for(k=0;k<8;k++)
21   {
22     ni=i+dx[k],nj=j+dy[k];
23     if(ni<0 || nj<0 || ni>=n || nj>=m || vis[ni][nj]) continue;
24     vis[ni][nj]=1;
25     dfs(ni,nj,cnt+1);
26     vis[ni][nj]=0;
27   }
28 }
29 int main()
30 {
31   int t,kase=0,i,j;
32   scanf("%d",&t);
33   while(t--)
34   {
35     scanf("%d%d",&m,&n);
36     printf("Scenario #%d:\n",++kase);
37     if(n*m==1){puts("A1\n");continue;}
38     ok=0;
39     memset(vis,0,sizeof(vis));
40     vis[0][0]=1;
41     dfs(0,0,0);
42     if(!ok) puts("impossible\n");
43   }
44   return 0;
45 }

 

posted @ 2012-04-25 17:15  BeatLJ  阅读(296)  评论(0编辑  收藏  举报