//找出最大的房子
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
int R,C;//行列數
int rooms[60][60];//rooms[i][j]表示[i][j]地方對應的房屋數值
int color[60][60];//方塊是否染過顏色標記
int maxRoomArea=0,roomNum=0;//最大房間面積,當前已經找的房間的數目
int roomArea; //正在探索的房間的面積
void Dfs(int i,int j){
if(color[i][j])return;
++roomArea;//此方塊沒有被染色,房間容量增加
color[i][j]=roomNum;//將顏色標記爲已經找到的房間的數目
//從這個位置[i][j]向四個方向探索
//&,見0變0,見1不變 //在本題中&1後變爲0則表示沒有牆,可以走
if((rooms[i][j]&1)==0)Dfs(i,j-1); //向西走
if((rooms[i][j]&2)==0)Dfs(i-1,j); //向北走
if((rooms[i][j]&4)==0)Dfs(i,j+1); //向東走
if((rooms[i][j]&8)==0)Dfs(i+1,j); //向南走
}
int main(){
cin>>R>>C;
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
cin>>rooms[i][j];
}
} //輸入房間情況
memset(color,0,sizeof(color));//將color全部初始爲0//memset只可以設置-1和0//不如fill方便
//查看[i][k]方塊是否被染色
for(int i=1;i<=R;i++){
for(int j=1;j<=C;j++){
if(!color[i][j]){//一旦發現新的沒有被染色的
++roomNum;//房間數增加
roomArea=0;
Dfs(i,j);//搜索之並染色
maxRoomArea=max(roomArea,maxRoomArea);
}
}//每次遍歷都會使一個房間的所有空間被填色
}
cout<<roomNum<<endl;
cout<<maxRoomArea<<endl;
return 0;
}
找出最大的房子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.