讨论 / RQ104[冰原探险]明显是广搜啊
不做寻常人 2008-09-12 06:30:00
点我顶贴 收藏 删除
题目类型居然写着"图结构"....

想了很久....实在不懂哪里是图结构......

由于题目没给出数据范围....

所以用矩阵记录地图是不可能的....

记录到达每个冰山4个方向的最少步数....

便可求出结果.....

朱全民老师的<奥赛经典>里面就有这道题...

#1 不做寻常人@2008-09-12 06:30:00
回复 删除
我的程序....可能比较垃圾...但请勿扔鸡蛋...

program project104;

type

data=record

x1,y1,x2,y2:longint;

end;

var

p1,p2:array[1..16000]of longint;

p:array[1..4000,1..4]of longint;

a:array[1..4000]of data;

min,op,ed,i,j,k,n,kk,k1,k2,ff,d,xx1,xx2,yy1,yy2,x,y,ox1,ox2,oy1,oy2:longint;

procedure init;

begin

readln(n);

readln(xx1,yy1);

readln(xx2,yy2);

for i:=1 to n do

with a[i] do readln(x1,y1,x2,y2);

for i:=1 to n do

for j:=1 to 4 do p[i,j]:=maxint;

end;

procedure addin(k,f,o,s:integer);

begin

if (o<>maxint)and(o<>-maxint)then

if p[k,f]=maxint then

begin

inc(ed);

p[k,f]:=s+1;

p1[ed]:=k;

p2[ed]:=f;

end;

end;

procedure main;

begin

min:=maxint;

op:=1;

ed:=0;

x:=xx1;

y:=yy1;

oy1:=maxint;

oy2:=-maxint;

for j:=1 to n do

if (a[j].x1<=x)and(a[j].x2>=x)then

begin

if (a[j].y1<oy1)and(a[j].y1>y)then

begin

oy1:=a[j].y1;

k1:=j;

end

else if (a[j].y2>oy2)and(a[j].y2<y)then

begin

oy2:=a[j].y2;

k2:=j;

end;

end;

addin(k1,3,oy1,0);

addin(k2,4,oy2,0);

if (xx2=x)and(oy1>=yy2)and(oy2<=yy2)then min:=1;

ox1:=maxint;

ox2:=-maxint;

for j:=1 to n do

if (a[j].y1<=y)and(a[j].y2>=y)then

begin

if (a[j].x1<ox1)and(a[j].x1>x)then

begin

ox1:=a[j].x1;

k1:=j;

end

else if (a[j].x2>ox2)and(a[j].x2<x)then

begin

ox2:=a[j].x2;

k2:=j;

end;

end;

addin(k1,1,ox1,0);

addin(k2,2,ox2,0);

if (yy2=y)and(ox1>=xx2)and(ox2<=xx2)then min:=1;

while op<=ed do

begin

kk:=p1[op];

ff:=p2[op];

if ff<=2 then

begin

if ff=1 then x:=a[kk].x1-1

else x:=a[kk].x2+1;

y:=a[kk].y1;

oy1:=maxint;

oy2:=-maxint;

for j:=1 to n do

if (a[j].x1<=x)and(a[j].x2>=x)then

begin

if (a[j].y1<oy1)and(a[j].y1>y)then

begin

oy1:=a[j].y1;

k1:=j;

end

else if (a[j].y2>oy2)and(a[j].y2<y)then

begin

oy2:=a[j].y2;

k2:=j;

end;

end;

addin(k1,3,oy1,p[kk,ff]);

addin(k2,4,oy2,p[kk,ff]);

if (xx2=x)and(oy1>=yy2)and(oy2<=yy2)then min:=p[kk,ff]+1;

end

else

begin

if ff=3 then y:=a[kk].y1-1

else y:=a[kk].y2+1;

x:=a[kk].x1;

ox1:=maxint;

ox2:=-maxint;

for j:=1 to n do

if (a[j].y1<=y)and(a[j].y2>=y)then

begin

if (a[j].x1<ox1)and(a[j].x1>x)then

begin

ox1:=a[j].x1;

k1:=j;

end

else if (a[j].x2>ox2)and(a[j].x2<x)then

begin

ox2:=a[j].x2;

k2:=j;

end;

end;

addin(k1,1,ox1,p[kk,ff]);

addin(k2,2,ox2,p[kk,ff]);

if (yy2=y)and(ox1>=xx2)and(ox2<=xx2)then min:=p[kk,ff]+1;

end;

inc(op);

end;

end;

begin

init;

main;

if min<>maxint then writeln(min)

else writeln(’0’);

end.

查看更多回复
提交回复