/*
解题报告:时间: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();
}
}
poj 1111【BFS】
最新推荐文章于 2020-06-23 17:21:17 发布