HDU1241 Oil Deposits

本文详细介绍了一个用于探测矩形区域内石油储藏的算法。通过深度优先搜索(DFS),算法能够识别并计算出不同油藏的数量。输入包括多个矩形区域,每个区域由一系列字符组成,代表是否有石油储藏。算法遍历每个小方格,将相邻的油藏标记并计数。

题目:

小烤 同志负责探测lz地下石油储藏。 小烤现在在一块矩形区域探测石油。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻(横向相邻,纵向相邻,还有对角相邻),那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。

输入:

输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油。(注意多组数据,必要的数组要及时清空~)

输出:

对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。

样例:

分析:逐行列寻找@,若找到执行DFS把与此@相连的@(包括此@)全部置为*

 1 #include<iostream>
 2 #include<sstream>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<string>
 6 #include<cstring>
 7 #include<algorithm>
 8 #include<functional>
 9 #include<iomanip>
10 #include<numeric>
11 #include<cmath>
12 #include<queue>
13 #include<vector>
14 #include<set>
15 #include<cctype>
16 #define PI acos(-1.0)
17 const int INF = 0x3f3f3f3f;
18 const int NINF = -INF - 1;
19 typedef long long ll;
20 using namespace std;
21 int m, n;
22 char maze[105][105];
23 int dx[8] = {1, 0, 1, -1, -1, 0, 1, -1}, dy[8] = {0, 1, 1, -1, 0, -1, -1, 1};
24 void dfs(int x, int y)
25 {
26     for (int i = 0; i < 8; ++i)
27     {
28         int nx = x + dx[i], ny = y + dy[i];
29         if (nx >= 0 && nx < m && ny >= 0 && ny < n && maze[nx][ny] == '@')
30         {
31             maze[nx][ny] = '*';
32             dfs(nx, ny);
33         }
34     }
35 }
36 int main()
37 {
38     while (cin >> m >> n)
39     {
40         if (m == 0 && n == 0) break;
41         int ans = 0;
42         for (int i = 0; i < m; ++i)
43         {
44             for (int j = 0; j < n; ++j)
45                 cin >> maze[i][j];
46         }
47         for (int i = 0; i < m; ++i)
48         {
49             for (int j = 0; j < n; ++j)
50             {
51                 if (maze[i][j] == '@')
52                 {
53                     maze[i][j] = '*';
54                     dfs(i, j);
55                     ans++;
56                 }
57             }
58         }
59         cout << ans << endl;
60     }
61     return  0;
62 }

 

转载于:https://www.cnblogs.com/veasky/p/10991659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值