題目描述
在"我的世界"遊戲中,一桶水就可以匯聚成一片湖。現在有一個 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);
}
}