#广搜#The Castle(城堡)

http://noi.openjudge.cn/ 166

或http://ybt.ssoier.cn:8088/ 1250

 

一座城堡被分成m*n个方块(m≤50,n≤50),每个方块可有0~4堵墙(0表示无墙)。下面示出了建筑平面图:

#广搜#The Castle(城堡)_第1张图片

图中的加粗黑线代表墙。几个连通的方块组成房间,房间与房间之间一定是用黑线(墙)隔开的。

现在要求你编一个程序,解决以下2个问题:

1、该城堡中有多少个房间?

2、最大的房间有多大?

题目分析:问题求多少个房间,最大房间的面积,用广搜的方法,找到一个还没有处理的点,并把该点以及其他可以到的点处理掉,算出总数。

 
#include 
#include 
using namespace std;
const int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0}; (右转:way对应左边……)
enum way{W,E,S,N};int n,m,big,ans;bool a[51][51][4],v[51][51]; int d;
bool check(int x,int y,int i){
	if (x<1||x>n||y<1||y>m||v[x][y]||a[x][y][i]) return false; else return true;
}
int bfs(int x,int y){
	int head=0,tail=1,stat[2501][2]; v[x][y]=1,stat[1][0]=x,stat[1][1]=y;
	do{
		head++; //出队(队首加一)
		for (int i=0;i<4;i++)
		if (check(stat[head][0]+dx[i],stat[head][1]+dy[i],i)) //判断
		{tail++; //入队(队尾加一)
                 v[stat[head][0]+dx[i]][stat[head][1]+dy[i]]=1; //已经访问过了
                 stat[tail][0]=stat[head][0]+dx[i];
                 stat[tail][1]=stat[head][1]+dy[i];
                 }
	}while (head=8) a[i][j][S]=1,d-=8; //(8:南墙(蓝翔))
		if (d>=4) a[i][j][E]=1,d-=4; // (4:东墙)
		if (d>=2) a[i][j][N]=1,d-=2; // (2:北墙)
		if (d==1) a[i][j][W]=1,d-=1; // (1:西墙)
	}
	for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++)
	if (!v[i][j]){ //没有访问过
		big=max(bfs(i,j),big); //求最大值 max()需调用algorithm
		ans++; //房间数增加
	}
	printf("%d\n%d",ans,big);
	return 0;
}

 

 

 

 

 

你可能感兴趣的:(搜索)