AcWing 1098. 城堡問題(Food fill)

整理的算法模板:ACM算法模板總結(分類詳細版) 

   1   2   3   4   5   6   7  
   #############################
 1 #   |   #   |   #   |   |   #
   #####---#####---#---#####---#
 2 #   #   |   #   #   #   #   #
   #---#####---#####---#####---#
 3 #   |   |   #   #   #   #   #
   #---#########---#####---#---#
 4 #   #   |   |   |   |   #   #
   #############################
           (圖 1)

   #  = Wall   
   |  = No wall
   -  = No wall

   方向:上北下南左西右東。

圖1是一個城堡的地形圖。

請你編寫一個程序,計算城堡一共有多少房間,最大的房間有多大。

城堡被分割成 m∗nm∗n個方格區域,每個方格區域可以有0~4面牆。

輸入格式

第一行包含兩個整數 mm 和 nn,分別表示城堡南北方向的長度和東西方向的長度。

接下來 mm 行,每行包含 nn 個整數,每個整數都表示平面圖對應位置的方塊的牆的特徵。

每個方塊中牆的特徵由數字 PP 來描述,我們用1表示西牆,2表示北牆,4表示東牆,8表示南牆,PP 爲該方塊包含牆的數字之和。

例如,如果一個方塊的 PP 爲3,則 3 = 1 + 2,該方塊包含西牆和北牆。

城堡的內牆被計算兩次,方塊(1,1)的南牆同時也是方塊(2,1)的北牆。

輸入的數據保證城堡至少有兩個房間。

輸出格式

共兩行,第一行輸出房間總數,第二行輸出最大房間的面積(方塊數)。

數據範圍

1≤m,n≤501≤m,n≤50,
0≤P≤150≤P≤15

輸入樣例:

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

 

典型的Food fill(其實就是dfs暴搜即可),爲了形成系統的做題方式,還是練練bfs  來Food fill一下吧;只不過每一個點的狀態需要處理;不是單純的一個點,而是對這個點的信息進行判斷,然後看它的哪個方向能走;

用dfs暴搜的話,如果有一百萬的格子,最壞的情況下,遞歸一百萬層gg了;

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int N=55;
int mp[N][N],m,n,ans,cnt;
bool st[N][N];
int dix[4]={0,-1,0,1},diy[4]={-1,0,1,0};
int bfs(int x,int y)
{
    queue<PII> q;
    q.push({x,y});
    st[x][y]=true;
    int s=0;
    while(!q.empty())
    {
        auto res=q.front();
        q.pop();
        s++;
        for(int i=0;i<4;i++)
        {
            int xx=res.first+dix[i],yy=res.second+diy[i];
            if(xx<0||xx>=m||yy<0||yy>=n) continue;
            if(st[xx][yy]) continue;
            if((mp[res.first][res.second]>>i)&1) continue;
            q.push({xx,yy});
            st[xx][yy]=true;
            
        }
    }
    return s;
}
int main()
{
    cin >>m>>n;
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            cin >>mp[i][j];
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            if(!st[i][j]) ans=max(ans,bfs(i,j)),cnt++;
    cout <<cnt<<endl<<ans<<endl;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章