1. 程式人生 > 其它 >全球變暖(bfs、flood fill演算法)

全球變暖(bfs、flood fill演算法)

你有一張某海域 N×N 畫素的照片,”.”表示海洋、”#”表示陸地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......
其中”上下左右”四個方向上連在一起的一片陸地組成一座島嶼,例如上圖就有 2 座島嶼。

由於全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個畫素的範圍會被海水淹沒。

具體來說如果一塊陸地畫素與海洋相鄰(上下左右四個相鄰畫素中有海洋),它就會被淹沒。

例如上圖中的海域未來會變成如下樣子:

.......
.......
.......
.......
....#..
.......
.......
請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。

輸入格式
第一行包含一個整數N。

以下 N 行 N 列,包含一個由字元”#”和”.”構成的 N×N 字元矩陣,代表一張海域照片,”#”表示陸地,”.”表示海洋。

照片保證第 1 行、第 1 列、第 N 行、第 N 列的畫素都是海洋。

輸出格式
一個整數表示答案。

資料範圍
1≤N≤1000
輸入樣例1:
7
.......
.##....
.##....
....##.
..####.
...###.
.......
輸出樣例1:
1
輸入樣例2:
9
.........
.##.##...
.#####...
.##.##...
.........
.##.#....
.#.###...
.#..#....
.........
輸出樣例2:
1

程式碼:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=1010;
char g[N][N];//地圖
bool st[N][N];//判重陣列
PII q[N*N];//佇列
int n;
int dx[4]={1,0,-1,0};//座標偏移量
int dy[4]={0,1,0,-1};
void bfs(int sx,int sy,int &total,int &bound){
    int hh=0,tt=0;//定義隊頭和隊尾指標
    q[0]={sx,sy};//入隊
    st[sx][sy]=true;//將該點設為已探索
    while(hh<=tt){
        auto t=q[hh++];//定義變數存隊頭元素,並將其彈出
        total++;//整體內陸數量+1
        bool is_bound=false;//當前元素預設為內陸
        for(int i=0;i<4;i++)
        {
            int x=t.x+dx[i],y=t.y+dy[i];
            if(x<0||x>=n||y<0||y>=n) continue;
            if(st[x][y]==true) continue;
            if(g[x][y]=='.'){
                is_bound=true;//原始的元素置為沿海
                continue;
            }
            q[++tt]={x,y};//從隊尾插入新的元素
            st[x][y]=true;//該店已探索
            
        }
        if(is_bound) bound++;//判斷已經出隊的元素是否為沿海陸地(邊界連通塊)
    }
    
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++) scanf("%s",&g[i]);//輸入字串時比定義的字元陣列少一維
    int cnt=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        if(!st[i][j]&&g[i][j]=='#'){//如果沒探索過該點並且該店屬於連通塊中即陸地
            int total=0,bound=0;
            bfs(i,j,total,bound);
            if(total==bound) cnt++;
        }
    
    printf("%d\n",cnt);

    return 0;
}