圍成面積(資訊學奧賽一本通 - T1359)
阿新 • • 發佈:2021-02-10
技術標籤:資訊學奧賽一本通(第五版)T1359資料結構 ——佇列
題目描述
程式設計計算由“*”號圍成的下列圖形的面積。
面積計算方法是統計*號所圍成的閉合曲線中水平線和垂直線交點的數目。
如下圖所示,在 10 × 10 的二維陣列中,有 *
圍住了 15 個點,因此面積為 15;
輸入格式
10 × 10 的圖形。
輸出格式
輸出面積。
輸入樣例
0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
輸出樣例
15
題解
BFS:
解題思路
:先將 1
外面的 0
都變成 1
,最後再統計 0
的個數;
#include <iostream>
#include <queue>
using namespace std;
struct Node
{
int x, y;
};
int g[15][15];
queue<Node> q;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void bfs(int x, int y)
{
q.push({x, y});
g[x][y] = 1;
while(q.size())
{
Node t = q.front();
q.pop();
for (int i = 0; i < 4; i ++)
{
int a = t.x + dx[i], b = t.y + dy[i];
if(a < 1 || a > 10 || b < 1 || b > 10 || g[a][b]) continue;
q.push({a, b});
g[a][b] = 1;
}
}
}
int main()
{
for (int i = 1; i <= 10 ; i ++)
for (int j = 1; j <= 10; j ++)
cin >> g[i][j];
for (int i = 1; i <= 10; i ++) // 上
if(!g[1][i]) bfs(1, i);
for (int i = 1; i <= 10; i ++) // 下
if(!g[10][i]) bfs(10, i);
for (int i = 1; i <= 10; i ++) // 左
if(!g[i][1]) bfs(i, 1);
for (int i = 1; i <= 10; i ++) // 右
if(!g[i][10]) bfs(i, 10);
int ans = 0;
for (int i = 1; i <= 10; i ++)
for (int j = 1; j <= 10; j ++)
if(!g[i][j]) ans ++;
cout << ans << endl;
return 0;
}