1250:The Castle

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;
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章