HDU 1241 Oil Deposits

很简单很经典的DFS题目

题意:

'@'代表一块油田,在以它为中心的九宫格里的'@',也算同在一块油田,问所给矩阵中有多少块油田

思路:

遍历地图中的每一个格子,如果遇到'@',则DFS,将这块变为'*',然后八个方向继续DFS

这样整个搜索完毕以后,这个map就全部变为'*'了

 

第一次居然忘了做数组越界检测,结果还AC了,不过以后DFS千万千万要记得这个!

=_=!! 

 

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 char map[103][103];
 8 int dir[8][2] = {{0, 1},{0, -1},{1, 0}, {-1, 0},{1, 1}, {1, -1},{-1, 1},{-1, -1}};
 9 int m, n;
10 
11 void DFS(int x, int y)
12 {
13     map[x][y] = '*';
14     for(int i = 0; i < 8; ++i)
15     {
16         int xx = x + dir[i][0];
17         int yy = y + dir[i][1];
18         if( xx>=0 && xx<m && yy>=0 && yy<n
19              && map[xx][yy] == '@')
20         {
21             map[xx][yy] = '*';
22             DFS(xx, yy);
23         }
24     }
25 }
26 
27 int main(void)
28 {
29     #ifdef LOCAL
30         freopen("1241in.txt", "r", stdin);
31     #endif
32 
33     while(scanf("%d%d", &m, &n) == 2)
34     {
35         if(m == 0 && n == 0)
36             break;
37         for(int i = 0; i < m; ++i)
38             scanf("%s", map[i]);
39         int cnt = 0;
40         for(int i = 0; i < m; ++i)
41             for(int j = 0; j < n; ++j)
42             {
43                 if(map[i][j] == '@')
44                 {
45                     ++cnt;
46                     DFS(i, j);
47                 }
48             }
49 
50         printf("%d\n", cnt);
51     }
52     return 0;
53 }
代码君

 

posted @ 2014-08-05 05:52  AOQNRMGYXLMV  阅读(300)  评论(0编辑  收藏  举报