1. 程式人生 > 其它 >圍成面積(資訊學奧賽一本通 - T1359)

圍成面積(資訊學奧賽一本通 - T1359)

技術標籤:資訊學奧賽一本通(第五版)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

0 0 0 0 0 0 0 0 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; }