HDU 1241 Oil Deposits DFS搜索题

题目大意:给你一个m*n的矩阵,里面有两种符号,一种是 @ 表示这个位置有油田,另一种是 * 表示这个位置没有油田,现在规定相邻的任意块油田只算一块油田,这里的相邻包括上下左右以及斜的的四个方向相邻的位置。要你求出一共有多少块油田。

解题报告:用dfs,我的做法是首先在输入的时候将每个有油田的位置标记为1,否则标记为0,然后枚举每一个点,如果这个点有油田,则以这个点为起点,像周围的八个方向搜索,搜到了相邻的点就标记为2,当然这里也可以标记为0,只要是将已经搜过的点标记掉就是了,当dfs退出到main函数的时候,油田数量加一。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<cstdlib>
 7 const int MAX = 100+5;
 8 int m,n,map[MAX][MAX],num;
 9 int dire[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
10 void dfs(int x,int y) {
11     if(map[x][y] == 1) {
12         map[x][y] = 2;
13         for(int i = 0;i<8;++i) {
14             int xx = x + dire[i][0];
15             int yy = y + dire[i][1];
16             if(xx<1||xx>m||yy<1||yy>n)
17             continue;
18             dfs(xx,yy);
19         }
20     }
21 }
22             
23 
24 int main() {
25     char c,shu[MAX][MAX];
26     while(scanf("%d%d",&m,&n),m+n) {
27         memset(map,0,sizeof(map));
28         for(int i = 1;i<=m;++i) {
29             getchar();
30             for(int j = 1;j<=n;++j) {
31                 scanf("%c",&c);
32                 if(c == '@')
33                 map[i][j] = 1;
34             }
35         }
36         int ans = 0;
37         for(int i = 1;i<=m;++i)
38         for(int j = 1;j<=n;++j)
39         if(map[i][j] == 1) {
40             dfs(i,j);
41             ans++;
42         }
43         printf("%d\n",ans);
44     }
45     return 0;
46 }
47 
48         
View Code

 

posted @ 2013-07-28 20:37  xiaxiaosheng  阅读(216)  评论(0编辑  收藏  举报