POJ-1164简单搜索

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
typedef long long ll;
int R,C;
int room[60][60];
int color[60][60];
int maxRoomArea = 0;//最大房间面积
int roomNum = 0;//房间数
int roomArea;//当前房间面积
void dfs(int i,int k)
{
	if (color[i][k] != 0)
		return;
	++roomArea;
	color[i][k] = roomNum;
	if ((room[i][k] & 1) == 0)dfs(i, k - 1);//向西
	if ((room[i][k] & 2) == 0)dfs(i-1,k);//向北
	if ((room[i][k] & 4) == 0)dfs(i,k+1);//向东
	if ((room[i][k] & 8) == 0)dfs(i+1,k);//向南
}
int main()
{
	scanf("%d%d",&R,&C);
	for (int i = 0; i < R; i++)
		for (int j = 0; j < C; j++)
			scanf("%d",&room[i][j]);
	memset(color,0,sizeof(color));
	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			if (!color[i][j])
			{
				++roomNum;//为这一个新房间标上号
				roomArea = 0;
				dfs(i, j);
				maxRoomArea = max(roomArea, maxRoomArea);
			}
		}
	}
	cout << roomNum << endl;
	cout << maxRoomArea << endl;
	
}

题目描述:

右图是一个城堡的地形图 。请你编写一个程序,计 算城堡一共有多少房间, 最大的房间有多大。城堡 被分割成m×n(m≤50, n≤50)个方块,每个方块可 以有0~4面墙。

 输入  程序从标准输入设备读入数据。  第一行是两个整数,分别是南北向、东西向的方块数。  在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数 字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南 墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两 次,方块(1,1)的南墙同时也是方块(2,1)的北墙。  输入的数据保证城堡至少有两个房间。  输出  城堡的房间数、城堡中最大房间所包括的方块数。  结果显示在标准输出设备上。

解题思路:

把方块看作是节点,相邻两个方块之间如果没 有墙,则在方块之间连一条边,这样城堡就能 转换成一个图。
 求房间个数,实际上就是在求图中有多少个极 大连通子图。
 一个连通子图,往里头加任何一个图里的其他 点,就会变得不连通,那么这个连通子图就是 极大连通子图。(如:(8,5,6))

猜你喜欢

转载自blog.csdn.net/qq_17175221/article/details/81212062