求连通块周长,先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;
}