DFS:城堡问题(深度优先搜索入门问题)

城堡问题

1表示西墙,2表示北墙,4表示东墙,8表示南墙。
每个方块用代表其周围墙的数字之和表示。
在这里插入图片描述

输入

城堡的行数和列数及表示每个方格四周墙的数字

输出

城堡的房间数、城堡中最大房间所包括的方块数

输入样例

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

DFS(深度优先搜索)

#include<iostream>
using namespace std;
int roomnum, roomarea, maxroomarea;//全局变量自动初始化为0 
int room[100][100], color[100][100];
int R, C;//行和列 

void DFS(int i, int j)
{
    
    
	if(color[i][j]) return ;//搜索过程中如果所有方块面积已经涂色则结束该轮搜索 
	roomarea++;//隐藏else if搜索出未涂色的方块,本轮该房间面积+1后继续搜索 
	color[i][j] = 1;//标记涂色该方块 
	if(!(room[i][j]&1)) DFS(i,j-1);//向左(西)走 
	if(!(room[i][j]&2)) DFS(i-1,j);//向上(北)走 
	if(!(room[i][j]&4)) DFS(i,j+1);//向右(东)走 
	if(!(room[i][j]&8)) DFS(i+1,j);//向下(南)走 
}

int main()
{
    
    
	cin>>R>>C;
	for(int i = 1;i <= R;i++)
		for(int j = 1;j <= C;j++)
			cin>>room[i][j];//输入数据
			
	for(int i = 1;i <= R;i++)
		for(int j = 1;j <= C;j++)
			if(!color[i][j])//该轮搜索中发现未涂色方块 
			{
    
    
				roomnum++;//找到一个新房间! 
				roomarea = 0;//由于这是一个新发现的房间所以要重新开始数该房间方块面积 
				DFS(i, j);//对新发现的房间进行一轮DFS搜索 
				maxroomarea = max(roomarea, maxroomarea);//该房间搜索结束并与记录下的最大面积进行比较 
			}
			
	cout<<roomnum<<endl<<maxroomarea;
	return 0;
} 

注释
1.使用max函数的头文件为iostream
2.&表示按位与,需将十进制数转换为二进制后使用
运算法则:两数相同得1,不同得0
如11&4

1011
& 0100
0000

我们发现:将0取反可以表示没有东墙的情况
而其他数又如6&4

0110
& 0100
1101

1101显然不为0取反后可以表示有东墙的情况

猜你喜欢

转载自blog.csdn.net/m0_51354361/article/details/113119425