NOIP2010 引水入城
Posted bzmdAndy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2010 引水入城相关的知识,希望对你有一定的参考价值。
1066 引水入城
2010年NOIP全国联赛提高组
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
#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; }
以上是关于NOIP2010 引水入城的主要内容,如果未能解决你的问题,请参考以下文章