讨论 / 怎么就不A了呢?
速度恢复健康 2011-09-28 22:45:00
点我顶贴 收藏 删除
const

step:array[1..4,1..2] of longint=((1,0),(-1,0),(0,1),(0,-1));

var

n,m,i,j,j1,k,max,ans:longint;

a:array[0..501,0..501] of longint;

vis:array[0..501,0..501] of boolean;

rs:array[0..501] of boolean;

f:array[0..300000,1..2] of longint;

g:array[0..501,0..501] of longint;

procedure kp(i,j:longint);

var

x,y,t,mid1,mid2:longint;

begin

x:=i;

y:=j;

mid1:=g[(i+j) div 2,1];

mid2:=g[(i+j) div 2,2];

repeat

while (g[x,1]<mid1) or ((g[x,1]=mid1) and (g[x,2]>mid2)) do inc(x);

while (g[y,1]>mid1) or ((g[y,1]=mid1) and (g[y,2]<mid2)) do dec(y);

if x<=y

then

begin

t:=g[x,1];

g[x,1]:=g[y,1];

g[y,1]:=t;

t:=g[x,2];

g[x,2]:=g[y,2];

g[y,2]:=t;

inc(x);

dec(y);

end;

until x>y;

if x<j

then

kp(x,j);

if y>i

then

kp(y,i);

end;

procedure bfs1(o:longint);

var

s,t,i,j,x,y,x1,y1:longint;

begin

s:=0;

t:=0;

f[s,1]:=1;

f[s,2]:=o;

repeat

x:=f[s,1];

y:=f[s,2];

for i:=1 to 4 do

begin

x1:=x+step[i,1];

y1:=y+step[i,2];

if (a[x1,y1]<a[x,y]) and (not vis[x1,y1]) and (x1>0) and (y1>0) and (x1<=n) and (y1<=m)

then

begin

vis[x1,y1]:=true;

if x1=n

then

rs[y1]:=true;

if x=n

then

rs[y]:=true;

inc(t);

f[t,1]:=x1;

f[t,2]:=y1;

end;

end;

inc(s);

until s>t;

end;

procedure bfs2(o:longint);

var

s,t,i,j,x,y,x1,y1:longint;

begin

s:=0;

t:=0;

f[s,1]:=n;

f[s,2]:=o;

repeat

x:=f[s,1];

y:=f[s,2];

for i:=1 to 4 do

begin

x1:=x+step[i,1];

y1:=y+step[i,2];

if (a[x1,y1]<a[x,y]) and (not vis[x1,y1]) and (x1>0) and (y1>0) and (x1<=n) and (y1<=m)

then

begin

vis[x1,y1]:=true;

inc(t);

f[t,1]:=x1;

f[t,2]:=y1;

if x1=1

then

g[y1,1]:=o;

end;

end;

inc(s);

until s>t;

end;

procedure bfs3(o:longint);

var

s,t,i,j,x,y,x1,y1:longint;

begin

s:=0;

t:=0;

f[s,1]:=n;

f[s,2]:=o;

repeat

x:=f[s,1];

y:=f[s,2];

for i:=1 to 4 do

begin

x1:=x+step[i,1];

y1:=y+step[i,2];

if (a[x1,y1]<a[x,y]) and (not vis[x1,y1]) and (x1>0) and (y1>0) and (x1<=n) and (y1<=m)

then

begin

vis[x1,y1]:=true;

inc(t);

f[t,1]:=x1;

f[t,2]:=y1;

if x1=1

then

g[y1,2]:=o;

end;

end;

inc(s);

until s>t;

end;

begin

readln(n,m);

for i:=1 to n do

begin

for j:=1 to m do

read(a[i,j]);

readln;

end;

for i:=1 to m do

begin

bfs1(i);

end;

ans:=0;

for i:=1 to m do

if not rs[i]

then

inc(ans);

if ans>0

then

begin

writeln(0);

writeln(ans);

halt;

end;

fillchar(vis,sizeof(vis),false);

for i:=1 to m do

bfs2(i);

for i:=m downto 1 do

bfs3(i);

kp(1,m);

k:=1;

repeat

max:=0;

for i:=2 to m do

if (g[i,1]-g[k,2]<2) and (g[i,2]-g[k,2]>max)

then

begin

max:=g[i,2]-g[k,2];

j:=g[i,2];

j1:=g[i,1];

end;

inc(k);

g[k,1]:=j1;

g[k,2]:=j;

until g[k,2]=m;

writeln(1);

writeln(k+2);

end.

#1 rqnoj_风雨兼程@2011-09-28 22:45:00
回复 删除
代码好长~~186行

查看更多回复
提交回复