ZOJ-1047

27 篇文章 0 订阅

求连通块周长,先BFS求连通块,注意斜向连通的也算,然后遍历每个X格看有几个相邻非X格,这里相邻就不包含斜向的了,累加后就是周长

#include<cstdio>
#include<deque>
#include<cstring>

using namespace std;

int main()
{
	int r, c, row, col;
	int dir[8][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 }, { -1, -1 }, {
			-1, 1 }, { 1, -1 }, { 1, 1 } };
	bool grid[20][20], temp[20][20];
	deque<pair<int, int> > queue;
	while (scanf("%d%d%d%d", &r, &c, &row, &col), r)
	{
		getchar();
		for (int i = 0; i < r; i++)
		{
			for (int j = 0; j < c; j++)
				grid[i][j] = getchar() == 'X';
			getchar();
		}
		queue.clear();
		queue.push_back(make_pair(row - 1, col - 1));
		memset(temp, 0, sizeof(temp));
		temp[row - 1][col - 1] = true;
		while (!queue.empty())
		{
			pair<int, int> now = queue.front();
			queue.pop_front();
			for (int i = 0; i < 8; i++)
			{
				int rr = dir[i][0] + now.first;
				int cc = dir[i][1] + now.second;
				if (rr >= 0 && rr < r && cc >= 0 && cc < c && grid[rr][cc]
						&& !temp[rr][cc])
				{
					temp[rr][cc] = true;
					queue.push_back(make_pair(rr, cc));
				}
			}
		}
		int res = 0;
		for (int i = 0; i < r; i++)
			for (int j = 0; j < c; j++)
				if (temp[i][j])
				{
					int d = 4;
					for (int k = 0; k < 4; k++)
					{
						int rr = i + dir[k][0];
						int cc = j + dir[k][1];
						if (rr >= 0 && rr < r && cc >= 0 && cc < c
								&& temp[rr][cc])
							d--;
					}
					res += d;
				}
		printf("%d\n", res);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值