hdu 1241 Oil Deposits 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241

  这是我的第一条深搜题,参考了一个非常有耐心指导我的师兄的代码才写出来的(算是模板吧),觉得dfs好神奇。

  在我看来,使用dfs主要包括几点:1、建图(map,通常是二维数组)   2、标记(visited,对已经访问过的点标记,防止再搜)   3、对边界条件和不符合条件的判断。满足才dfs,不满足return。引用那位很好人的师兄的话,深搜基本就是暴力。

 

 1 #include <iostream>
 2 using namespace std;
 3 
 4 char map[105][105];
 5 int i, j, m, n;          //全局变量,以便在dfs()和main()里可见
 6 
 7 void dfs(int i, int j)
 8 {
 9     if (map[i][j] != '@' || i < 0 || j < 0 || i >= m || j >= n)
10         return;
11     else
12     {
13         map[i][j] = '*';   //这题的标记是直接在map里操作
14         dfs(i-1, j-1);      //向8个方向里搜
15         dfs(i-1, j);
16         dfs(i-1, j+1);
17         dfs(i, j-1);
18         dfs(i, j+1);
19         dfs(i+1, j-1);
20         dfs(i+1, j);
21         dfs(i+1, j+1);
22     }
23 }
24 
25 int main()
26 {
27     int total;
28     while (cin >> m >> n && (m || n))
29     {
30         total = 0;
31         for (i = 0; i < m; i++)
32         {
33             for (j = 0; j < n; j++)
34                 cin >> map[i][j];
35         }
36         for (i = 0; i < m; i++)
37         {
38             for (j = 0; j < n; j++)
39             {
40                 if (map[i][j] == '@')
41                 {
42                     dfs(i, j); 
43                     total++;  //直到不能再找到一大片油田才加1
44                 }
45             }
46         }
47         cout << total << endl;
48     }
49     return 0;
50 }

 

 

posted @ 2013-04-22 20:49  windysai  阅读(169)  评论(0编辑  收藏  举报