水流問題(dfs)

題目描述
在"我的世界"遊戲中,一桶水就可以匯聚成一片湖。現在有一個 n x m 的大陸,大陸上各個單元格的高度是不一致的。大陸同時和“太平洋”與“大西洋”接壤。
(1)“太平洋”處於大陸的左邊界和上邊界
(2)“大西洋”處於大陸的右邊界和下邊界。

現在在大陸上某個座標倒下一桶水,規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。

請找出那些水流既可以流動到“太平洋”,又能流動到“大西洋”的陸地單元的座標數量。
輸入
測試樣例由多組測試數據組成。每組測試數據第一行輸入兩個正整數n(1 <= n <= 150 ) 和 m ( 1 <= m < = 150 ),代表大陸的長和寬。接下來n行,每行輸入m個非負整數,代表大陸上每個單元格的高度。
輸出
輸出既可以流動到太平洋又可以流動到大西洋的單元格數量
樣例輸入 Copy
5 5
1 2 2 3 5
3 2 3 4 4
2 4 5 3 1
6 7 1 4 5
5 1 1 2 4
樣例輸出 Copy
7

解題思路:
典型的圖上搜索題,BFS/DFS 均可以。唯一要注意我們不
能每一個每一個點去搜索判斷,這樣會超時,我們可以從太平洋和大
西洋的範圍從外到裏面搜,輸出太平洋和大西洋同時能搜索到的點即
可輸出。

#include<bits/stdc++.h>
using namespace std;
int n,m,vis[200][200],v[200][200],a[200][200];
int f[4][2]={0,1,0,-1,1,0,-1,0};
bool check(int x,int y){
    if(x>=0 && x<n && y>=0 && y<m) return true;
    return false;
} 
void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int s=x+f[i][0];
        int s1=y+f[i][1];
        if(check(s,s1) && vis[s][s1]==0 && a[x][y]<=a[s][s1]){
            vis[s][s1]=1;
            dfs(s,s1);
        }
    }
}
void dfs1(int x,int y){
    for(int i=0;i<4;i++){
        int s=x+f[i][0];
        int s1=y+f[i][1];
        if(check(s,s1) && v[s][s1]==0 && a[x][y]<=a[s][s1]){
            v[s][s1]=1;
            dfs1(s,s1);
        }
    }
}
int main(){
    int i,j,sum;
    while(~scanf("%d%d",&n,&m)){
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                scanf("%d",&a[i][j]);
                v[i][j]=0;
                vis[i][j]=0;
            }
        } 
        for(i=0;i<n;i++){
            if(!vis[i][0]){
                vis[i][0]=1;
                dfs(i,0);
            }
            if(!v[i][m-1]){
                v[i][m-1]=1;
                dfs1(i,m-1);
            }
        }
        for(i=0;i<m;i++){
            if(!vis[0][i]){
                vis[0][i]=1;
                dfs(0,i);
            }
            if(!v[n-1][i]){
                v[n-1][i]=1;
                dfs1(n-1,i);
            }
        }
        sum=0;
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                if(vis[i][j] && v[i][j]){
                    sum++;
                }
            }
        }
        printf("%d\n",sum);
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章