#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct def1
{
int x;
int y;
} q[3000000];
struct def2
{
int len;
int x;
int y;
} val[550];
int dctx[6]= {0,1,0,-1,0},dcty[6]= {0,0,1,0,-1};
int n,m,h=0,t=0,cnt=0,height[550][550];
bool vis[550][550];
bool cmp(def2 a,def2 b)
{
if(a.x==0)return false;
if(b.x==0)return true;
if(a.x!=b.x)return a.x<b.x;
else return a.y>b.y;
}
void bfs()
{
memset(vis,0,sizeof(vis));
for(int i=1; i<=m; i++)
{
t++;
q[t].x=1;//行
q[t].y=i;//列
vis[1][i]=true;
}
while(h<=t)
{
h++;
for(int i=1; i<=4; i++)
{
int x=q[h].x+dctx[i];
int y=q[h].y+dcty[i];
if(height[q[h].x][q[h].y]>height[x][y]&&(!vis[x][y]))
{
t++;
q[t].x=x;
q[t].y=y;
vis[x][y]=true;
}
}
}
}
void dfs(int x,int y)
{
vis[x][y]=true;
for(int i=1; i<=4; i++)
{
int tx=x+dctx[i],ty=y+dcty[i];
if(height[x][y]>height[tx][ty]&&vis[tx][ty]!=true)
{
dfs(tx,ty);
}
}
}
int main()
{
memset(height,0x3f,sizeof(height));
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>height[i][j];
bfs();
for(int i=1; i<=m; i++)
if(!vis[n][i])
cnt++;
if(cnt!=0)
{
cout<<0<<endl<<cnt<<endl;
return 0;
}
// dfs确定一个点可覆盖的区间[x,y]
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++)
// cout<<vis[i][j]<<‘ ‘;
// cout<<endl;
// }
cnt=0;
for(int i=1; i<=m; i++)
{
memset(vis,0,sizeof(vis));
dfs(1,i);
cnt++;
bool flag=false;
for(int j=1; j<=m; j++)
{
if(flag==false&&vis[n][j]==true)
{
flag=true;
val[cnt].x=val[cnt].y=j;
}
if(flag==true&&vis[n][j+1]==false)
{
val[cnt].y=j;
break;
}
}
val[cnt].len=val[cnt].y-val[cnt].x+1;
}
// 贪心每次取最大覆盖区间
int maxn=1,tot=1,i=2;
sort(val+1,val+1+cnt,cmp);
for(int i=1; i<=cnt; i++)
cout<<val[i].x<<‘ ‘<<val[i].y<<endl;
while(val[maxn].y<m)
{
int tmp=maxn;
while(i<=m&&val[i].x<=val[maxn].y+1)
{
if(val[i].y>val[tmp].y) tmp=i;
i++;
}
maxn=tmp;
tot++;
}
cout<<1<<endl<<tot<<endl;
return 0;
}
时间: 2024-10-17 20:28:45