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

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

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

解析:

#include

#include

#include

#include

using namespace std;

struct pos { int x, y; };

int bfs(vector & map, vector > & visit)

{

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

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

queue 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 mp(n + 2);

vector > visit(n + 2, vector(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;

}

你可能感兴趣的:(c++,算法,java)