整理的算法模板: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;
}