代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans=0;
int a[706][706];
bool vis[706][706];
const int dx[8]={1,-1,0,0,1,1,-1,-1};
const int dy[8]={0,0,1,-1,-1,1,1,-1};
void dfs(int x,int y,int cnt,int high){
for(int i = 0;i < 4;++i){
int xx=x+dx[i];
int yy=y+dy[i];
int xz_h=a[x][y],next_h=a[xx][yy];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]&&a[xx][yy]!=0){
if(next_h>xz_h){
high=next_h;
}
a[xx][yy]=cnt;
vis[xx][yy]=true;
dfs(xx,yy,cnt,high);
}
}
for(int i = 4;i < 8;++i){
int xx=x+dx[i];
int yy=y+dy[i];
if(i==4){
if(a[xx][yy+1]==0&&a[xx-1][yy]==0) continue;
}
if(i==5){
if(a[xx][yy-1]==0&&a[xx-1][yy]==0) continue;
}
if(i==6){
if(a[xx+1][yy]==0&&a[xx][yy-1]==0) continue;
}
if(i==8){
if(a[xx+1][yy]==0&&a[xx][yy+1]==0) continue;
}
int xz_h=a[x][y],next_h=a[xx][yy];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!vis[xx][yy]&&a[xx][yy]!=0){
if(next_h>xz_h){
high=next_h;
}
a[xx][yy]=cnt;
vis[xx][yy]=true;
dfs(xx,yy,cnt,high);
}
}
return;
}
int main(){
cin>>n>>m;
memset(vis,false,sizeof(vis));
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
cin>>a[i][j];
}
}
int c=-1;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
if(!vis[i][j]&&a[i][j]!=0){
ans++;
vis[i][j]=true;
dfs(i,j,c,a[i][j]);
c--;
}
}
}
cout << ans;
return 0;
}