科學家發現了一種新型的蜜蜂,它們的蜂巢結構為立方體,蜂巢被蜂巢壁分割為好幾個小空間,而蜂后住在蜂巢內最大的空間中。今日為了研究這種蜜蜂,需找到蜂巢中的最大空間,以確認蜂后位置。蜂巢的長度為 L,寬度為 W,高度為 H,請你寫一個程式計算蜂巢中的最大空間為多少。
範例測資
範例輸入 | 範例輸出 |
---|---|
每筆測試資料為二列: 第一列有三個正整數 L、W、H(1 <= L、W、H <= 135),L、W、H 代表蜂巢的長、寬、高。 第二列共有 L*W*H 個字元,前 L*W 個字元為蜂巢的第一層,接下來 L*W 個字元為蜂巢的第二層,以此類推。每個字元可以是 0 或 1,1 代表蜂巢壁,0 代表蜂巢中的空間。 | 對每筆資料請輸出一列,請輸出蜂巢中的最大空間。 |
3 3 3 010101010001001111111101111 | 7 |
1 2 4 10000100 | 6 |
以輸入範例 1 為例,則蜂巢結構如下圖所示,蜂后所在的空間為灰色區域,共有七格。
解題思路
使用 BFS,但是這個 BFS 不會有遞迴的成分,將每一次的起點都存放到同一個陣列中,這樣子 BFS 中的起點迴圈就會一直跑直到沒有點為止,並且需要紀錄每一個點是否有走過。
範例程式碼-ZeroJudge K650: 尋找蜂后 (Queen bee)
#include <iostream>
#include <vector>
using namespace std;
struct pos{
int H;
int L;
int W;
bool operator<(const pos& other) const {
if (H != other.H) return H < other.H;
if (L != other.L) return L < other.L;
return W < other.W;
}
};
char bee[500][500][500] = {};
bool MAP[500][500][500] = {};
int L, W, H, ans = -999;
pos p (const int a, const int b, const int c) {
pos tmp;
tmp.H = a;
tmp.L = b;
tmp.W = c;
return tmp;
}
void BFS(vector<pos>start, int count) {
for (int i = 0; i<start.size(); i++) {
const int h = start[i].H, l = start[i].L, w = start[i].W;
if (MAP[h][l][w]) continue;
MAP[h][l][w] = true;
count++;
if (h - 1 >= 0 && !MAP[h-1][l][w] && bee[h-1][l][w] == '0') {
start.push_back(p(h-1, l, w));
}
if (h + 1 < H && !MAP[h+1][l][w] && bee[h+1][l][w] == '0') {
start.push_back(p(h+1, l, w));
}
if (l - 1 >= 0 && !MAP[h][l-1][w] && bee[h][l-1][w] == '0') {
start.push_back(p(h, l-1, w));
}
if (l + 1 < L && !MAP[h][l+1][w] && bee[h][l+1][w] == '0') {
start.push_back(p(h, l+1, w));
}
if (w - 1 >= 0 && !MAP[h][l][w-1] && bee[h][l][w-1] == '0') {
start.push_back(p(h, l, w-1));
}
if (w + 1 < W && !MAP[h][l][w+1] && bee[h][l][w+1] == '0') {
start.push_back(p(h, l, w+1));
}
}
ans = max(ans, count);
}
int main() {
cin.sync_with_stdio(0);
cin.tie(0);
cin >> L >> W >> H;
for (int i = 0; i<H; i++) {
for (int j = 0; j<L; j++) {
for (int k = 0; k<W; k++) {
cin >> bee[i][j][k];
MAP[i][j][k] = false;
}
}
}
for (int i = 0; i<L; i++) {
for (int j = 0; j<W; j++) {
if (bee[0][i][j] == '0') {
vector<pos>start;
start.push_back(p(0, i, j));
BFS(start, 0);
}
}
}
cout << ans << "\n";
}
//ZeroJudge K650
//Dr. SeanXD