找出最大的房子

//找出最大的房子
#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; 
}
發佈了185 篇原創文章 · 獲贊 14 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章