算法竞赛入门经典 例题6-12

UVa572

Oil Deposits

统计mn列的油田中连成大片的油田的个数。

#include <iostream>
#include <vector>

using namespace std;

class Solution
{
public:
	Solution(size_t m, size_t n, istream &is)
		: grid(vector<vector<char>>(m, vector<char>(n))),
		visited(vector<vector<bool>>(m, vector<bool>(n, false)))
	{
		for (size_t i = 0; i < m; i++)
		{
			for (size_t j = 0; j < n; j++)
			{
				is >> grid[i][j];
			}
		}
		for (size_t i = 0; i < m; i++)
		{
			for (size_t j = 0; j < n; j++)
			{
				if (grid[i][j] == '@' && !visited[i][j]) {
					CountOilDeposits(i, j);
					OilDeposits++;
				}
			}
		}
	};
	int OilDeposits = 0;
private:
	vector<vector<char>> grid;
	vector<vector<bool>> visited;
	void CountOilDeposits(size_t i, size_t j)
	{
		if (grid[i][j] != '@' || visited[i][j]) return;
		visited[i][j] = true;
		if (i > 0) {
			if (j > 0) {
				CountOilDeposits(i - 1, j - 1);
			}
			CountOilDeposits(i - 1, j);
			if (j + 1 < grid[i].size()) {
				CountOilDeposits(i - 1, j + 1);
			}
		}
		if (j > 0) {
			CountOilDeposits(i, j - 1);
		}
		if (j + 1 < grid[i].size()) {
			CountOilDeposits(i, j + 1);
		}
		if (i + 1 < grid.size()) {
			if (j > 0) {
				CountOilDeposits(i + 1, j - 1);
			}
			CountOilDeposits(i + 1, j);
			if (j + 1 < grid[i].size()) {
				CountOilDeposits(i + 1, j + 1);
			}
		}
	}
};

int main()
{
	size_t m, n;
	while (cin >> m >> n) {
		if (m == 0 && n == 0) break;
		Solution solution(m, n, cin);
		cout << solution.OilDeposits << endl;
	}
	return 0;
}
/*
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值