讨论 / 高分悬赏牛人帮忙给找找错误。。。。双向搜索
649273254 2010-11-08 22:22:00
点我顶贴 收藏 删除
type

node=record

x,y,step:longint;

end;

const

xx:array[1..5] of integer=(-2,1,1,1,1);

yy:array[1..5] of integer=(-2,-1,0,1,2);

var

s1,s2,s3,s4:integer;

head,tail:array[1..2] of longint;

f,g:array[1..2,0..10000000] of node;

use:array[1..2,0..1000,0..1000] of longint;

procedure init;

begin

readln(s1,s2,s3,s4);

head[1]:=0;tail[1]:=1;f[1,1].x:=s1;f[1,1].y:=s2;f[1,1].step:=0;

head[2]:=0;tail[2]:=1;f[2,1].x:=s3;f[2,1].y:=s4;f[2,1].step:=0;

fillchar(use,sizeof(use),0);

end;

procedure check(zi,zh,k,step1:longint);

begin

if use[k,zi,zh]>0 then

begin

write(use[k,zi,zh]+step1+1);

halt;

end;

end;

procedure wide(k:longint);

var

i:longint;

begin

inc(head[k]);

for i:=1 to 5 do

begin

if (f[k,head[k]].x+xx[i]>=0)and(f[k,head[k]].y+yy[i]>=0)

and(f[k,head[k]].x+xx[i]<=205)and(f[k,head[k]].y+yy[i]<=205)

and (use[k,f[k,head[k]].x+xx[i],f[k,head[k]].y+yy[i]]=0)

then

begin

check(f[k,head[k]].x+xx[i],f[k,head[k]].y+yy[i],3-k,f[k,head[k]].step);

inc(tail[k]);

f[k,tail[k]].x:=f[k,head[k]].x+xx[i];

f[k,tail[k]].y:=f[k,head[k]].y+yy[i];

f[k,tail[k]].step:=f[k,head[k]].step+1;

use[k,f[k,head[k]].x+xx[i],f[k,head[k]].y+yy[i]]:=f[k,tail[k]].step;

end;

end;

end;

begin

init;

repeat

if (head[1]<tail[1])and(tail[1]<=tail[2]) then wide(1);

if (head[2]<tail[2])and(tail[2]<tail[1]) then wide(2);

until (head[1]>=tail[1])or(head[2]>=tail[2]);

end.

#1 407137009@2010-11-08 22:19:00
回复 删除
双向搜的规则不一样,是反着来的。

我wide1和wide2单独写了两个过程

#2 649273254@2010-11-08 22:22:00
回复 删除
哇!还就是这么回事来。。。。。。。。。。。给分啦~~~~
查看更多回复
提交回复