您的位置:首页 > 其它

codevs 1066 引水入城

2016-11-14 22:12 330 查看
传送门

题目描述 Description

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 510
#define ll long long
using namespace std;
int xx[5]={0,0,0,1,-1},yy[5]={0,1,-1,0,0};
int n,m,ans1(0);
int h

,num
;
bool f

={0};
struct node
{
int l,r;
}xd
;
void bfs(int x,int y)//第一问。
{
f[x][y]=1;
for (int i=1;i<=4;i++)
{
int X=x+xx[i],Y=y+yy[i];
if (0<X&&X<=n&&0<Y&&Y<=m&&h[X][Y]<h[x][y]&&!f[X][Y])
{
f[X][Y]=1;
bfs(X,Y);
}
}
}
void bfs2(int x,int y,int k)//第二问。
{
if (x==n) xd[k].l=min(xd[k].l,y),xd[k].r=max(xd[k].r,y);
f[x][y]=1;
for (int i=1;i<=4;i++)
{
int X=x+xx[i],Y=y+yy[i];
if (0<X&&X<=n&&0<Y&&Y<=m&&h[X][Y]<h[x][y]&&!f[X][Y])
{
f[X][Y]=1;
bfs2(X,Y,k);
}
}
}
int main()
{
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++) bfs(1,i);
for (int i=1;i<=m;i++)
if (!f
[i]) ans1++;
if (ans1)
{
printf("0\n%d\n",ans1);
}
else
{
for (int i=1;i<=m;i++)
{
memset(f,0,sizeof(f));
xd[i].l=0x7fffffff/3;
xd[i].r=-xd[i].l;
bfs2(1,i,i);
}

num[0]=0;
for (int i=1;i<=m;i++)//线段区间dp
{
num[i]=0x7fffffff/3;
for (int j=1;j<=m;j++)
if (xd[j].l<=i&&xd[j].r>=i) num[i]=min(num[i],num[xd[j].l-1]+1);
}
printf("1\n%d\n",num[m]);
}

return 0;
}


bfs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: