hdu 1241Oil Deposits(dfs模板)

题目链接——

http://acm.hdu.edu.cn/showproblem.php?pid=1241

首先给出一个n*m的字符矩阵,‘*’表示空地,‘@’表示油井。问在这个矩阵中有多少组油井区?

每个点周围的8个点都可以与之相连。

从左上角的点开始向后枚举然后dfs搜索就可以了。记得记忆化。

废话说完,上代码——

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N = 210;
 8 const int M = 8;
 9 
10 int dis[M][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}}; //判断8个方向
11 char mp[N][N];  //原图
12 int n, m;       //矩阵大小
13 int ans;        //结果
14 
15 void dfs(int x, int y)  //dfs搜索函数
16 {
17     mp[x][y] = '*';         //当前点初处理后需要将它消掉,免得重复处理,即“记忆化”
18     for(int i = 0; i < M; i++)
19     {
20         int mx = x+dis[i][0];
21         int my = y+dis[i][1];
22         if(mx >= 0 && mx < n && my >= 0 && my < m && mp[mx][my] == '@') dfs(mx, my);
23     }
24 }
25 
26 void Work()             //主处理函数
27 {
28     for(int i = 0; i < n; i++)
29     {
30         for(int j = 0; j < m; j++)
31         {
32             if(mp[i][j] == '@')
33             {
34                 ans++;
35                 dfs(i, j);
36             }
37         }
38     }
39 }
40 
41 void Init()             //初始化函数
42 {
43     getchar();
44     for(int i = 0; i < n; i++) scanf("%s", mp[i]);
45     ans = 0;
46 }
47 
48 void Outit()            //输出函数
49 {
50     printf("%d
", ans);
51 }
52 
53 int main()
54 {
55     //freopen("test.in", "r", stdin);
56     while(~scanf("%d%d", &n, &m) && m)
57     {
58         Init();
59         Work();
60         Outit();
61     }
62     return 0;
63 }
View Code
原文地址:https://www.cnblogs.com/mypride/p/5459751.html