DFS1_城堡问题

城堡问题

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;
       }

猜你喜欢

转载自blog.csdn.net/weixin_43613299/article/details/85211799