城堡问题
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取反后可以表示有东墙的情况