城堡问题
dfs(v)
{
if(v访问过)
return;
//将v标记为访问过,对和v相邻的每个点u:dfs(u);
}
int main()
{
while(在图中能找到未访问过的点k)
dfs(k);
}
m*n(m<=50,n<=50)
输入
第一行:南北向、东西向的方块数
第二行输入一堆数表示周围的墙
1->西,2->北,4->东,8->南
输出
城堡的房间数、城堡中最大房间所包括的方块数
Input
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
Output
5
9
将各个房间分别染色,统计颜色种类,即每种颜色的数量
#include<iostream>
#include<strack>
#include<cstring>
using namespace std;
int R,C;
int rooms[60][60];
int color[60][60];
int maxRoomArea=0,roomNum=0;
int roomArea;
void Dfs(int i,int k)
{
if(color[i][k])
return;
++roomArea;
color[i][k]=roomNum;
if((rooms[i][k]&1)==0)Dfs(i,k-1); //西
if((rooms[i][k]&2)==0)Dfs(i-1,k); //北
if((rooms[i][k]&4)==0)Dfs(i,k+1); //东
if((rooms[i][k]&8)==0)Dfs(i+1,k); //南
//解释一下这个m&n;都搞成二进制的数,满足两个都是1,那结果就是1,这样就能把输入的数字转化为往什么方向走
int main()
{
cin>>R>>C;
for(int i=1;i<=R;++i)
for(int k=1;k<=C;++k)
cin>>rooms[i][k];
memset(color,0,sizeof(color));
for(int i=1;i<=R;++i)
for(intk=1;k<=C;++K)
{
if(!color[i][k])
{
++roomNum;
roomArea=0;
Dfs(i,k);
maxRoomArea=max(roomArea,maxRoomArea);
}
}
cout<<roomNum<<endl;
cout<<maxRoomArea<<endl;
}