http://ybt.ssoier.cn:8088/problem_show.php?pid=1250
1250:The Castle
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 3440 通過數: 1785
【題目描述】
一座城堡被分成m*n個方塊(m≤50,n≤50),每個方塊可有0~4堵牆(0表示無牆)。下面示出了建築平面圖:
圖中的加粗黑線代表牆。幾個連通的方塊組成房間,房間與房間之間一定是用黑線(牆)隔開的。
現在要求你編一個程序,解決以下2個問題:
1、該城堡中有多少個房間?
2、最大的房間有多大?
【輸入】
平面圖用一個數字表示一個方塊(第1個房間用二進制1011表示,0表示無東牆,用十進制11表示)。
第一行一個整數m(m≤50),表示房子南北方向的長度。
第二行一個整數n(n≤50),表示房子東西方向的長度。
後面的m行,每行有n個整數,每個整數都表示平面圖對應位置的方塊的特徵。每個方塊中牆的特徵由數字P來描述(0≤P≤15)。數字P是下面的可能取的數字之和:
1(西牆 west)
2(北牆 north)
4(東牆 east)
8(南牆 south)
室內的牆被定義兩次: 例如方塊(1,1)中的南牆也被位於其南面的方塊(2,1)定義了一次。
建築中至少有兩個房間。
【輸出】
第1行:一個整數,表示房間總數;
第2行:一個整數,表示最大房間的面積(方塊數)。
【輸入樣例】
4
7
11 6 11 6 3 10 6
7 9 6 13 5 15 5
1 10 12 7 13 7 5
13 11 10 8 10 12 13
【輸出樣例】
5
9
#include<bits/stdc++.h>
using namespace std;
#define N 55
int n, m, ssum, mmax;
bool f[N][N];
int a[N][N][4];
int h[N*N+5][3];
int dirx[4] = {1,0,-1,0};
int diry[4] = {0,1,0,-1};
bool in(int x, int y){
if(x>=0 && x<n && y>=0 && y<m)
return true;
return false;
}
void bfs(int x, int y){
++ssum;
int head = 0, tail = 1;
memset(h, 0, sizeof(h));
h[1][0] = x;
h[1][1] = y;
h[1][2] = 0;
f[x][y] = 1;
do{
++head;
for(int i=0; i<4; i++){
int tx = h[head][0] + dirx[i];
int ty = h[head][1] + diry[i];
if(in(tx, ty) && f[tx][ty] == 0 && a[h[head][0]][h[head][1]][i] == 0){
++tail;
//tx ty節點入隊開始
h[tail][0] = tx;
h[tail][1] = ty;
//tx ty節點入隊結束
f[tx][ty] = 1;
}
}
}while(head < tail);
mmax = max(mmax, tail);
return ;
}
int main(){
int x;
cin >> n >> m;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cin >> x;
if(x >= 8){
x -= 8;
a[i][j][0] = 1;
}
if(x >= 4){
x -= 4;
a[i][j][1] = 1;
}
if(x >= 2){
x -= 2;
a[i][j][2] = 1;
}
if(x >= 1){
x -= 1;
a[i][j][3] = 1;
}
}
}
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(f[i][j] == 0)
bfs(i, j);
}
}
cout << ssum << endl << mmax;
return 0;
}