城堡
被分割成m×n(m≤50,
n≤50)个方块,每个方块可
以有0~4面墙。
输入
程序从标准输入设备读入数据。
第一行是两个整数,分别是南北向、东西向的方块数。
在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数
字表示方块周围的墙, 1表示西墙, 2表示北墙, 4表示东墙, 8表示南
墙。 每个方块用代表其周围墙的数字之和表示。 城堡的内墙被计算两
次,方块(1,1)的南墙同时也是方块(2,1)的北墙。
输入的数据保证城堡至少有两个房间。
输出
城堡的房间数、城堡中最大房间所包括的方块数。
样例输入
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
1表示西墙, 2表示北墙, 4表示东墙, 8表
示南墙。每个方块用代表其周围墙的数字之
和表示。
解题思路
对每一个 方块,深度优先搜索,从而给这个方
块能够到达的所有位置染色。最后统计一共用
了几种颜色,以及每种颜色的数量。
比如
1 1 2 2 3 3 3
1 1 1 2 3 4 3
1 1 1 5 3 5 3
1 5 5 5 5 5 3
从而一共有5个房间,最大的房间( 1)占据9
个格子
算是一道简单的dfs,作为萌新的我还是勉强看别人代码才敲出来的,自己写的话不一定写得出来!!!
#include<iostream》
#include<cstring>
using namespace std;
int r,s; //行 列
int roomnum; //房间数
int area;
int a[60][60];
int b[60][60]; //标记
int maxarea;
void dfs(int i,int j)
{
if(b[i][j]!=0)
return; //这里用return 0;会报错 因为是void型 没有返回值!!!
area++;
b[i][j]=roomnum;
if((a[i][j]&1)==0) //向左走 //==运算级大于& 没套括号答案一直不对
dfs(i,j-1);
if((a[i][j]&2)==0) //向上走
dfs(i-1,j);
if((a[i][j]&4)==0) // 向右走
dfs(i,j+1);
if((a[i][j]&8)==0) //向下走
dfs(i+1,j);
}
int main()
{
while(cin>>r>>s)
{
roomnum=0;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=s;j++)
{
cin>>a[i][j];
}
}
memset(b,0,sizeof(b));
for(int i=1;i<=r;i++)
{
for(int j=1;j<=s;j++)
{
if(b[i][j]==0)
{
roomnum++;
area=0;
dfs(i,j);
maxarea=max(area,maxarea);
}
}
}
cout<<roomnum<<endl; //城堡所有房间数
cout<<maxarea<<endl; //最大房间的面积
}
return 1;
}