疯狂爆搜233333 dfsdfs%%%% 许多大佬都用bfs判断,这里我用了dfs,就不用再写bfs了。 思路 很容易发现区间一定是连续的,否则不行,就可以先爆搜出区间左和右,转化为一个区间覆盖问题
#include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int n,m,ans; struct st{ int l,r; }s[1999]; int cmp(const st &a,const st &b) { if(a.l<b.l||a.l==b.r&&a.r<b.r)return 1; return 0; } int a[1999][1999],f[1999][1999],q[1999][1999],ff[19999]; int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1},maxn=0; int dfs(int w,int x,int y) { if(x==n) { s[w].l=min(s[w].l,y);s[w].r=max(s[w].r,y); } for(int i=0;i<=2;i++) { int xxx=x+xx[i]; int yyy=y+yy[i]; if(xxx<1||xxx>n||yyy<1||yyy>m) continue; if(a[xxx][yyy]<a[x][y]&&!q[xxx][yyy]) { q[xxx][yyy]=1; dfs(w,xxx,yyy); } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); for(int i=1;i<=m;i++) if(a[1][i]>=a[1][i-1]&&a[1][i]>=a[1][i+1]) { q[1][i]=1; dfs(i,1,i); } for(int i=1;i<=m;i++) if(!q[n][i]) ans++; if(ans) { printf("0\n%d",ans); return 0; } else { for(int i=1;i<=m;i++) s[i].l=999999999,s[i].r=0; for(int i=1;i<=m;i++) if(a[1][i]>=a[1][i-1]&&a[1][i]>=a[1][i+1]) { memset(q,0,sizeof(q)); q[1][i]=1; dfs(i,1,i); } sort(s+1,s+m+1,cmp); int i=m;while(s[i].l==999999999)i--; int tot=0; while(maxn<m){ int wwww=maxn; for(int j=1;j<=i;j++){ if(s[j].l<=maxn+1) wwww=max(s[j].r,wwww); } tot++; maxn=wwww; } printf("1\n%d",tot); } }