poj2488_dfs_骑士

这也是一道DFS题,但写的还是不好。

题意:给一个矩阵r*c,求骑士可以从任意一点开始,是否能将这个矩阵中的各个点都走一遍。

分析:

 

1.字典顺序啊, lexicographical,当时也没管啥意思,唉。

2.不需要找到所有的情况,即如果遍历各点成功,就return ;

代码:

 

View Code
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <memory.h>
 4 using namespace std;
 5 
 6 const int maxnum=27;   //27,怎么会是8呢
 7 bool array[maxnum][maxnum];
 8 int lenx[maxnum*maxnum];
 9 int leny[maxnum*maxnum];
10 int ans,r,c,cur;
11 int lx[8]={-1,1,-2,2,-2,2,-1,1};  //字典顺序啊
12 int ly[8]={-2,-2,-1,-1,1,1,2,2};
13 
14 
15 bool judge(int x,int y)
16 {
17     if(x>=1 && x<=r && y>=1 && y<=c && !array[x][y])  //老不加!array[][]
18         return true;
19     return false;
20 }
21 
22 void dfs(int x,int y)
23 {
24     if(ans==r*c) return ;  //终止条件
25     int i;
26     for(i=0;i<8;i++)
27         if(judge(x+lx[i],y+ly[i]))
28         {
29             array[x+lx[i]][y+ly[i]]=true;
30             ans++;
31             lenx[cur]=x+lx[i];
32             leny[cur]=y+ly[i];
33             cur++;
34             dfs(x+lx[i],y+ly[i]);
35             if(ans==r*c) return ;   //没加,就会回溯
36             array[x+lx[i]][y+ly[i]]=false;
37             ans--;
38             cur--;
39         }
40 }
41 
42 int main()
43 {
44     int num,i,j,k;
45     bool flag;
46     scanf("%d",&num);
47     for(k=1;k<=num;k++)
48     {
49         scanf("%d%d",&r,&c);
50         flag=false;
51         for(j=1;j<=c;j++)
52         {
53             for(i=1;i<=r;i++)
54             {
55                 memset(array,false,sizeof(array));
56                 array[i][j]=true;  //没加
57                 ans=1;  //初始错了
58                 cur=1;
59                 lenx[cur]=i;
60                 leny[cur]=j;
61                 cur++;
62                 dfs(i,j);
63                 if(ans==r*c)
64                 {
65                     flag=true;
66                     break;
67                 }
68             }
69             if(flag)break;
70         }
71         printf("Scenario #%d:\n",k);
72         if(j==c+1)
73             printf("impossible\n");
74         else
75         {
76             for(i=1;i<r*c;i++)
77                 printf("%c%d",leny[i]-1+'A',lenx[i]);
78             if(i==r*c)
79                 printf("%c%d\n",leny[i]-1+'A',lenx[i]);
80         }
81         printf("\n");
82     }
83     return 0;
84 }

这都是dfs的简单题啊,看来得狂练。

此题也是tju oj1702

posted @ 2012-07-23 12:14  pushing my way  阅读(201)  评论(0编辑  收藏  举报