1250:The Castle 2021-01-05
阿新 • • 發佈:2021-01-07
1250:The Castle
時間限制: 1000 ms 記憶體限制: 65536 KB
【題目描述】
一座城堡被分成m*n個方塊(m≤50,n≤50),每個方塊可有0~4堵牆(0表示無牆)。下面示出了建築平面圖:
圖中的加粗黑線代表牆。幾個連通的方塊組成房間,房間與房間之間一定是用黑線(牆)隔開的。
現在要求你編一個程式,解決以下2個問題:
1、該城堡中有多少個房間?
2、最大的房間有多大?
【輸入】
平面圖用一個數字表示一個方塊(第1個房間用二進位制1011表示,0表示無東牆,用十進位制11表示)。
第一行一個整數m(m≤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
【輸出樣例】
5
9
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int hous[55][55][5]; int book[55][55]; int bj[1250][5]; int m,n,t,maxs=-1,tj=0; int x2[4]={0,-1,0,1}; int y2[4]={-1,0,1,0}; void bfs(int x1,int y1){ tj++; memset(bj,0,sizeof(bj)); int x,y,top=0,tail=1; bj[1][1]=x1,bj[1][2]=y1; book[x1][y1]=1; do{ top++; for(int e=0;e<4;e++){ x=bj[top][1]+x2[e]; y=bj[top][2]+y2[e]; if(x>0&&x<=m&&y>0&&y<=n&&book[x][y]==0&&hous[bj[top][1]][bj[top][2]][e]==0){ tail++;bj[tail][1]=x;bj[tail][2]=y;book[x][y]=1; } } }while(tail>top); maxs=max(maxs,tail); } int main(int argc, char *argv[]) { scanf("%d %d",&m,&n); for(int i=1;i<=m;i++) for(int j=1;j<=n;j++){ scanf("%d",&t); for(int k=0;k<4;k++){ hous[i][j][k]=t&1;t>>=1; // cout<<hous[i][j][k]; } } for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) if(book[i][j]==0) bfs(i,j); printf("%d\n%d\n",tj,maxs); return 0; }