求助
查看原帖
求助
714900
zyzbldnb楼主2023/3/11 20:23
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,h[505][504],l[505][505],r[504][505];
int dx[4]={0,1,-1,0};
int dy[4]={1,0,0,-1};
bool vis[505][505];
void dfs(int x,int y)
{
	vis[x][y]=1;
	//if(x==n) {
	//l[x][y]=y,r[x][y]=y;
		//return ;
	//}
	int xx,yy;
    for(int i=0;i<4;i++)
    {
    	 xx=x+dx[i];
    	 yy=y+dy[i];
    	if( (xx>n||xx<1||yy>m||yy<1)||h[xx][yy]>=h[x][y]||vis[xx][yy])
    	continue;
      dfs(xx,yy);
    l[x][y]=min(l[x][y],l[xx][yy]);
	r[x][y]=max(r[x][y],r[xx][yy]);
	}
	
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
	  cin>>h[i][j];
	}
	memset(l,0x3f,sizeof(l));
	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]==0)
		dfs(1,i);
		
	int num=0;
	for(int i=1;i<=m;i++)
	if(!vis[n][i]) //有没遍历到的
	num++;
	if(num>0){
		cout<<0<<endl<<num;
		return 0;
	}
	int left=1,cnt=0;//,maxr=0;
	 //for(int i=1;i<=m;i++)
	 //cout<<r[1][i]<<" ";
    while(left<=m) {
    	int maxr=0;
    	for(int i=1;i<=m;i++)
    	if(l[1][i]<=left) maxr=max(maxr,r[1][i]);
    	cnt++;
    	left=maxr+1;
    	//cout<<"left="<<left<<endl;
    	
	}
   cout<<1<<endl<<cnt;
   return 0;
}
2023/3/11 20:23
加载中...