比赛 |
练习12 |
评测结果 |
AAAAAAAAAA |
题目名称 |
引水入城 |
最终得分 |
100 |
用户昵称 |
hee |
运行时间 |
0.092 s |
代码语言 |
C++ |
内存使用 |
1.52 MiB |
提交时间 |
2017-06-29 23:21:36 |
显示代码纯文本
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
#include<map>
#include<set>
#define MAXX 501
using namespace std;
queue<int>x,y;
int f[MAXX];
bool vis[MAXX][MAXX];
int mapp[MAXX][MAXX],n,m,ans;
int dx[5]={0,0,1,-1,0};
int dy[5]={0,1,0,0,-1};
struct segment{
int l,r;
}s[MAXX];
bool comp(const segment & a,const segment & b){return a.l<b.l;}
void bfs(){
for(int i=1;i<=m;++i)x.push(1),y.push(i),vis[1][i]=true;
while(!x.empty()){
int xx=x.front(),yy=y.front();
for(int i=1;i<=4;++i){
int zx=xx+dx[i],zy=yy+dy[i];
if(zx<1||zx>n||zy<1||zy>m||vis[zx][zy]||mapp[zx][zy]>=mapp[xx][yy])continue;
vis[zx][zy]=true;
x.push(zx),y.push(zy);
}
x.pop(),y.pop();
}
}
void dfs(int x,int y,int num){
if(x==n){s[num].l=min(s[num].l,y);s[num].r=max(s[num].r,y);}
for(int i=1;i<=4;++i){
int zx=x+dx[i],zy=y+dy[i];
if(zx<1||zx>n||zy<1||zy>m||vis[zx][zy]||mapp[zx][zy]>=mapp[x][y])continue;
vis[zx][zy]=true;
dfs(zx,zy,num);
}
}
int main(){
freopen("flow.in","r",stdin);
freopen("flow.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)scanf("%d",&mapp[i][j]);
bfs();for(int j=1;j<=m;++j)if(!vis[n][j])ans++;
if(ans){
printf("0\n%d",ans);
return 0;
}
for(int i=1;i<=m;++i){
memset(vis,false,sizeof(vis));
s[i].l=m+1,s[i].r=0;dfs(1,i,i);
}
f[0]=0;
sort(s+1,s+m+1,comp);
for(int i=1;i<=m;++i){
f[i]=MAXX*MAXX*MAXX;
for(int j=1;j<=m;++j)
if(s[j].l<=i){
if(s[j].r>=i)
f[i]=min(f[i],f[s[j].l-1]+1);
}
else continue;
}
printf("1\n%d",f[m]);
return 0;
}