思路:
#include<bits/stdc++.h> using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(!isdigit(c)) { if(c==‘-‘) { b=-1; } c=getchar(); } while(isdigit(c)) { a=(a<<3)+(a<<1)+(c^48); c=getchar(); } return a*b; } bool flag; int n,m,cnt; int high[501][501]; bool vis[501][501]; int l[501][501]; int r[501][501]; int x[5]={0,1,-1,0,0}; int y[5]={0,0,0,1,-1}; inline void dfs(int nx,int ny) { vis[nx][ny]=1; for(int i=1;i<=4;i++) { if(nx+x[i]<1||ny+y[i]<1||nx+x[i]>n||ny+y[i]>m) { continue; } if(high[nx+x[i]][ny+y[i]]>=high[nx][ny]) { continue; } if(!vis[nx+x[i]][ny+y[i]]) { dfs(nx+x[i],ny+y[i]); } l[nx][ny]=min(l[nx][ny],l[nx+x[i]][ny+y[i]]); r[nx][ny]=max(r[nx][ny],r[nx+x[i]][ny+y[i]]); } } int main() { n=read(); m=read(); memset(l,63,sizeof(l)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { high[i][j]=read(); } } for(int i=1;i<=m;i++) { l[n][i]=r[n][i]=i; } for(int i=1;i<=m;i++) { if(!vis[1][i]) { dfs(1,i); } } for(int i=1;i<=m;i++) { if(!vis[n][i]) { flag=1; cnt++; } } if(flag) { puts("0"); printf("%d",cnt); return 0; } int left=1; while(left<=m) { int maxright=0; for(int i=1;i<=m;i++) { if(l[1][i]<=left) { maxright=max(maxright,r[1][i]); } } cnt++; left=maxright+1; } puts("1"); printf("%d",cnt); return 0; }
原文:https://www.cnblogs.com/gongcheng456/p/12774869.html