提交时间:2024-03-02 11:32:22
运行 ID: 134045
#include<bits/stdc++.h> using namespace std; const int inf = 2147483647,size = 505; int m,n,a[size][size],f[size]; int dis[4][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}}; bool visited[size][size],isno[size]; struct node{ int l,r; }p[size]; void dfs(int x, int y, int cnt){ visited[x][y] = true; if(x == m){ isno[y] = 1; p[cnt].l = min(p[cnt].l, y); p[cnt].r = max(p[cnt].r, y); } if(a[x+1][y]<a[x][y]&&x!=m&&!visited[x+1][y]) dfs(x+1,y,cnt); if(a[x-1][y]<a[x][y]&&x!=1&&!visited[x-1][y]) dfs(x-1,y,cnt); if(a[x][y+1]<a[x][y]&&y!=n&&!visited[x][y+1]) dfs(x,y+1,cnt); if(a[x][y-1]<a[x][y]&&y!=1&&!visited[x][y-1]) dfs(x,y-1,cnt); } void init() { scanf("%d %d",&m,&n); for(int i=1;i<=n;i++) p[i].l=f[i]=inf; f[0]=0; for(int i=1;i<=m;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); } int main(int argc, char const *argv[]){ init(); for(int i=1;i<=n;i++) memset(visited,false,sizeof(visited)), dfs(1,i,i); int count = 0; for(int i=1;i<=n;i++) if(!isno[i]) count++; if(count) printf("0\n%d\n",count); else { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(p[j].l<=i&&i<=p[j].r) f[i]=min(f[i],f[p[j].l-1]+1); printf("1\n%d\n",f[n]); } return 0; }