HDU 1198 Farm Irrigation(DFS)

题目链接

挺有意思的,我所理解的题意:最少打几个井,本来以为挺简单,最后发现实现的时候搞麻烦了,注意一下往下搜的条件是两个字母,在那个方向匹配上,才能继续搜下去。1Y。

 1 #include <stdio.h>
 2 #include <string.h>
 3 char p[51][51];
 4 int k[12][4] = {{1,1,0,0},{0,1,1,0},//记录所有的字母4个方向,顺序为左上右下
 5 {1,0,0,1},{0,0,1,1},{0,1,0,1},{1,0,1,0},//1代表有,0代表没有
 6 {1,1,1,0},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,1}};
 7 int  o[51][51],n,m;
 8 void dfs(int x,int y)
 9 {
10     int s,i,t;
11     s = p[x][y] - 'A';
12     for(i = 0;i <= 3;i ++)
13     {
14         if(i == 0&&k[s][i])
15         {
16             if(y-1 >= 0)
17             {
18                 t = p[x][y-1] - 'A';
19                 if(!o[x][y-1]&&k[t][2])//没搜过且这个方向对应的方向也有河流
20                 {
21                     o[x][y-1] = 1;
22                     dfs(x,y-1);
23                 }
24             }
25         }
26         else if(i == 1&&k[s][i])
27         {
28             if(x-1 >= 0)
29             {
30                 t = p[x-1][y] - 'A';
31                 if(!o[x-1][y]&&k[t][3])
32                 {
33                     o[x-1][y] = 1;
34                     dfs(x-1,y);
35                 }
36             }
37         }
38         else if(i == 2&&k[s][i])
39         {
40             if(y+1 <= m-1)
41             {
42                 t = p[x][y+1] - 'A';
43                 if(!o[x][y+1]&&k[t][0])
44                 {
45                     o[x][y+1] = 1;
46                     dfs(x,y+1);
47                 }
48             }
49         }
50         else if(i == 3&&k[s][i])
51         {
52             if(x+1 <= n-1)
53             {
54                 t = p[x+1][y] - 'A';
55                 if(!o[x+1][y]&&k[t][1])
56                 {
57                     o[x+1][y] = 1;
58                     dfs(x+1,y);
59                 }
60             }
61         }
62     }
63 }
64 int main()
65 {
66     int i,j,z;
67     while(scanf("%d%d%*c",&n,&m)!=EOF)
68     {
69         memset(o,0,sizeof(o));
70         z = 0;
71         if(n < 0||m < 0)
72         break;
73         for(i = 0;i <= n-1;i ++)
74         scanf("%s",p[i]);
75         for(i = 0;i <= n-1;i ++)
76         for(j = 0;j <= m-1;j ++)
77         {
78           if(!o[i][j])
79           {
80               o[i][j] = 1;
81               dfs(i,j);
82               z ++;
83           }
84         }
85         printf("%d\n",z);
86     }
87     return 0;
88 }
posted @ 2012-07-12 20:24  Naix_x  阅读(153)  评论(0)    收藏  举报