AcWing 1106. 山峰和山谷
原题链接
中等
作者:
minux
,
2020-05-20 17:39:00
,
所有人可见
,
阅读 741
c++ bfs
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
#define fi first
#define se second
const int N=1005;
int n;
int G[N][N];
queue<PII> q;
bool vis[N][N];
int main(){
memset(vis, 0x00, sizeof vis);
memset(G, 0x00, sizeof G);
cin>>n;
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
cin>>G[i][j];
function<void(int, int, bool&, bool&)> bfs=[&](int i, int j, bool& hier, bool& lower){
q.push({i, j});
vis[i][j]=true;
while(!q.empty()){
int x=q.front().fi;
int y=q.front().se;
q.pop();
for(int nx=x-1; nx<=x+1; nx++)
for(int ny=y-1; ny<=y+1; ny++){
if(0<=nx && nx<n && 0<=ny && ny<n){
if(G[nx][ny]==G[x][y]){
if(!vis[nx][ny]) {vis[nx][ny]=true; q.push({nx, ny});}
}
else if(G[nx][ny]>G[x][y]) hier=true;
else lower=true;
}
}
}
};
int peak=0, vally=0;
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
if(!vis[i][j]){
bool hier=false, lower=false;
bfs(i, j, hier, lower);
if(!hier) peak++;
if(!lower) vally++;
}
}
}
cout<<peak<<" "<<vally<<endl;
return 0;
}