给你一张n*m的西湖地图二值图,其中西湖的轮廓用1表示,轮廓内核轮廓外均用0表示。现在请你统计西湖的面积,即轮廓内0的个数。

给你一张n*m的西湖地图二值图,其中西湖的轮廓用1表示,轮廓内核轮廓外均用0表示。

现在请你统计西湖的面积,即轮廓内0的个数。

解析:

#include <iostream>

#include <string>

#include <queue>

#include <vector>

using namespace std;

struct pos { int x, y; };

int bfs(vector<string> & map, vector<vector<bool> > & visit)

{

const int dir[4][2] = { { -1,0 },{ 1,0 },{ 0,-1 },{ 0,1 } };

int n = map.size(), m = map[0].size();

queue<pos> que;

pos start{ 0,0 };

que.push(start);

visit[start.x][start.y] = true;

while (!que.empty())

{

pos cur = que.front(), next;

que.pop();

for (int i = 0; i < 4; ++i)

{

next.x = cur.x + dir[i][0];

next.y = cur.y + dir[i][1];

if (next.x >= 0 && next.x < n && next.y >= 0 && next.y < m && \

!visit[next.x][next.y] && map[next.x][next.y] != '1')

{

que.push(next);

visit[next.x][next.y] = true;

}

}

}

int count = 0;

for (int i = 0; i < n; ++i)

for (int j = 0; j < m; ++j)

if (visit[i][j]) ++count;

int one = 0;

for (int i = 0; i < n; ++i)

for (int j = 0; j < m; ++j)

if (map[i][j] == '1') ++one;

return m * n - count - one;

}

int main()

{

int n, m;

while (cin >> n >> m)

{

vector<string> mp(n + 2);

vector<vector<bool> > visit(n + 2, vector<bool>(m + 2, false));

mp[0] = string(m + 2, '0');

for (int i = 1; i <= n; ++i)

{

cin >> mp[i];

mp[i] = "0" + mp[i] + "0";

}

mp[n+1] = string(m + 2, '0');

cout << bfs(mp, visit) << endl;

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_72429728

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值