同感,贴代码求助
```cpp
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define maxn 505
using namespace std;
inline void read(int &x)
{
x=0; char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
}
struct data
{
int x,y;
}a[maxn];
int comp(data a,data b) { return a.x<b.x; }
const int fx[4]={0,1,0,-1},fy[4]={1,0,-1,0};
int map[maxn][maxn],n,m,i,j,q[maxn*maxn*2+10][2],tot,ans=1;
bool f[maxn][maxn],flag=0;
int main()
{
read(n); read(m);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
read(map[i][j]);
memset(f,true,sizeof(f));
int head=0,tail=0;
for (j=1;j<=m;++j)
f[1][j]=0,q[++tail][0]=1,q[tail][1]=j;
while (head++<tail)
{
for (i=0;i<4;++i)
{
int xx=q[head][0]+fx[i],yy=q[head][1]+fy[i];
if (f[xx][yy]&&xx>0&&yy>0&&xx<=n&&yy<=m&&map[xx][yy]<map[q[head][0]][q[head][1]])
{
f[xx][yy]=0;
q[++tail][0]=xx; q[tail][1]=yy;
}
}
}
for (j=1;j<=m;++j)
if (f[n][j]) { flag=1; tot++; }
if (flag)
{
puts("0");
printf("%d",tot);
return 0;
}
for (j=1;j<=m;++j)
{
memset(f,true,sizeof(f));
f[1][j]=0;
head=0; tail=1;
q[1][0]=1; q[1][1]=j;
while (head++<tail)
{
for (i=0;i<4;++i)
{
int xx=q[head][0]+fx[i],yy=q[head][1]+fy[i];
if (f[xx][yy]&&xx>0&&xx<=n&&yy>0&&yy<=m&&map[xx][yy]<map[q[head][0]][q[head][1]])
{
q[++tail][0]=xx; q[tail][1]=yy;
f[xx][yy]=0;
}
}
}
for (i=1;i<=m;++i)
if (!f[n][i]) { a[j].x=i; break; }
for (;i<=m+1;++i)
if (f[n][i]) { a[j].y=i-1; break; }
}
sort(a+1,a+m+1,comp);
puts("1");
int end=a[1].y,last=a[1].y;
if (last==m) { printf("%d",ans); return 0; }
for (i=1;i<=m;++i)
if (a[i].x<=end) last=max(last,a[i].y); else ans++,end=last;
printf("%d",ans+1);
return 0;
}
```
by hl666 @ 2017-11-03 13:31:23
改过了,发现区间覆盖打炸了
同时记录的时候也出现了些问题
by hl666 @ 2017-11-03 14:35:14
对于楼主的,表示大佬的区间修改看不懂
by hl666 @ 2017-11-03 14:37:00