The Castle(信息学奥赛一本通-T1250)
生活随笔
收集整理的這篇文章主要介紹了
The Castle(信息学奥赛一本通-T1250)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
一座城堡被分成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<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 51 #define MOD 2520 #define E 1e-12 using namespace std; int n,m; int a[N][N]; int b[4]={1,2,4,8}; bool vis[N][N]; int sum,maxx; int dir[4][2]={{0,-1},{-1,0},{0,1},{1,0}}; struct node {int x;int y; }q[N*100]; void bfs(int x0,int y0) {int head=1,tail=1;int cnt=1;vis[x0][y0]=1;q[tail].x=x0;q[tail].y=y0;tail++;while(head<tail){int x=q[head].x;int y=q[head].y;for(int i=0;i<4;i++){int nx=x+dir[i][0];int ny=y+dir[i][1];if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&vis[nx][ny]==0&&(a[x][y]&b[i])==0){cnt++;vis[nx][ny]=1;q[tail].x=nx;q[tail].y=ny;tail++;}}head++;}if(cnt>maxx)maxx=cnt;sum++; } int main() {memset(vis,0,sizeof(vis));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(vis[i][j]==0)bfs(i,j);printf("%d\n%d\n",sum,maxx);return 0; }?
總結
以上是生活随笔為你收集整理的The Castle(信息学奥赛一本通-T1250)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马的遍历(洛谷-P1443)
- 下一篇: 分组背包(信息学奥赛一本通-T1272)