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 }
代码君

 

你可能感兴趣的:(HDU)