标签:超过 城市 inpu 空格 slide 倒序 height body sample
2010年NOIP全国联赛提高组
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int h[505][505],bj[505][2],f[505],bx[4]={1,-1},by[4]={0,0,1,-1}; bool vis[505][505]; void dfs(int x,int y,int a,int b) { vis[x][y]=1; for(int i=0;i<4;++i) { int ba=bx[i]+x,bb=by[i]+y; if(!vis[ba][bb]&&(a?h[ba][bb]>h[x][y]:h[ba][bb]<h[x][y])) dfs(ba,bb,a,b); } if(a&&x==1) bj[y][b]=a; } int main() { int n,m,ans=0;; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) scanf("%d",&h[i][j]); for(int i=1;i<=m;++i) if(!vis[1][i]) dfs(1,i,0,0); for(int i=1;i<=m;++i) if(!vis[n][i]) ++ans; if(ans) { printf("0\n%d",ans); return 0; } memset(vis,0,sizeof(vis)); for(int i=1;i<=m;++i) if(!vis[n][i]) dfs(n,i,i,0); memset(vis,0,sizeof(vis)); for(int i=m;i;--i) if(!vis[n][i]) dfs(n,i,i,1); memset(f,0x3f,sizeof(f)); f[0]=0; for(int i=1;i<=m;++i) for(int j=1;j<=m;++j) if(bj[j][1]>=i&&bj[j][0]<=i) f[i]=min(f[i],f[bj[j][0]-1]+1); printf("1\n%d",f[m]); return 0; }
标签:超过 城市 inpu 空格 slide 倒序 height body sample
原文地址:http://www.cnblogs.com/bzmd/p/7173558.html