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 }

 

转载于:https://www.cnblogs.com/algorithms/archive/2012/04/25/2470144.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值