1. 程式人生 > 其它 >1250:The Castle 2021-01-05

1250:The Castle 2021-01-05

技術標籤:基礎演算法例項# 廣度優先搜尋

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),表示房子南北方向的長度。

第二行一個整數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 <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;
}