poj 1111【BFS】

/*
解题报告:时间:2020.xx.xx
怎么想的:
简单说一下题目:一个东西可以往八个方向传染,求被传染区域的周长
其实来看就是一道搜索题目 搜到符合题意的X,然后求传染路径所形成图的周长
关键:图的周长等于一个点周围'.'的数量总和
      所以最开始用一圈'.'包围图会比较方便
然后bfs的套路就好了 
*/
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n, m, stx, sty;
const int N = 100;
char g[N][N];
bool d[N][N];
int dx[] = { 0,-1,-1,-1,0,1,1,1 };//对应八个方向
int dy[] = { -1,-1,0,1,1,1,0,-1 };
int dx2[] = { 0,-1,0,1 };//对应后面枚举的四个方向
int dy2[] = { -1,0,1,0 };
struct Pair
{
	int x, y;
};
int cal()
{
	int x, y;
	int ans = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
		{
			if (d[i][j] == true && g[i][j] == 'X')
			{
				for (int k = 0; k < 4; k++)
				{
					x = i + dx2[k], y = j + dy2[k];
					if (g[x][y] == '.')
					{
						ans++;
					}
				}
			}
		}
	return ans;
}

void bfs()
{
	memset(d, false, sizeof(d));
	d[stx][sty] = true;
	queue<Pair>q;
	while (!q.empty())
	{
		q.pop();
	}
	q.push({ stx,sty });

	while (!q.empty())
	{
		Pair head = q.front();
		q.pop();
		for (int i = 0; i < 8; i++)
		{
			int x, y;
			x = head.x + dx[i], y = head.y + dy[i];
			if (d[x][y] == false && x >= 1 && x <= n && y >= 1 && y <= m && g[x][y] == 'X')
			{
				d[x][y] = true;
				q.push({ x,y });
			}
		}
	}
	cout << cal() << endl;

	int aaa = 1ll;
}
int main()
{
	while (cin >> n >> m >> stx >> sty)
	{
		if (n == 0 || m == 0 || stx == 0 || sty == 0)break;
		for (int i = 0; i <= n + 1; i++)
			for (int j = 0; j <= m + 1; j++)
			{
				g[i][j] = '.';
			}

		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= m; j++)
				cin >> g[i][j];

		bfs();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值