The Castle(信息学奥赛一本通-T1250)
【題目描述】
一座城堡被分成m*n個(gè)方塊(m≤50,n≤50),每個(gè)方塊可有0~4堵墻(0表示無(wú)墻)。下面示出了建筑平面圖:
圖中的加粗黑線代表墻。幾個(gè)連通的方塊組成房間,房間與房間之間一定是用黑線(墻)隔開(kāi)的。
現(xiàn)在要求你編一個(gè)程序,解決以下2個(gè)問(wèn)題:
????1、該城堡中有多少個(gè)房間?
????2、最大的房間有多大?
【輸入】
平面圖用一個(gè)數(shù)字表示一個(gè)方塊(第1個(gè)房間用二進(jìn)制1011表示,0表示無(wú)東墻,用十進(jìn)制11表示)。
第一行一個(gè)整數(shù)m(m≤50),表示房子南北方向的長(zhǎng)度。
第二行一個(gè)整數(shù)n(n≤50),表示房子?xùn)|西方向的長(zhǎng)度。
后面的m行,每行有n個(gè)整數(shù),每個(gè)整數(shù)都表示平面圖對(duì)應(yīng)位置的方塊的特征。每個(gè)方塊中墻的特征由數(shù)字P來(lái)描述(0≤P≤15)。數(shù)字P是下面的可能取的數(shù)字之和:
????1(西墻 west)
????2(北墻 north)
????4(東墻 east)
????8(南墻 south)
室內(nèi)的墻被定義兩次: 例如方塊(1,1)中的南墻也被位于其南面的方塊(2,1)定義了一次。
建筑中至少有兩個(gè)房間。
【輸出】
第1行:一個(gè)整數(shù),表示房間總數(shù);
第2行:一個(gè)整數(shù),表示最大房間的面積(方塊數(shù))。
【輸入樣例】
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; }?
總結(jié)
以上是生活随笔為你收集整理的The Castle(信息学奥赛一本通-T1250)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 马的遍历(洛谷-P1443)
- 下一篇: 分组背包(信息学奥赛一本通-T1272)