RQ83 魔兽世界
2011年8月16日 00:25
虽然只是普通的BFS,但此题非常神奇!如果通过传送门到一个点,那么点不需要被标记掉。代码又长又乱,几行又删了,凑合看吧.
const
dire:array[1..4,1..2]of integer=((1,0),(0,1),(0,-1),(-1,0));
type
int=longint;
rec=record
x1,x2,y1,y2:int;
step:boolean;
end;
rec2=record
x,y,step:int;
end;
var
i,j,k,xx,yy,n,m,min,head,tail:int;
map:array[1..101,1..101] of char;
hash:array[1..101,1..101] of boolean;
bro:array['A'..'Z'] of rec;
f:array[0..10000] of rec2;
ch:char;
can,add:boolean;
begin
min:=$fffffff;
head:=0;tail:=1;can:=false;
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(map[i][j]);
if map[i,j]>='A' then
begin
if bro[map[i][j]].step=false then
begin
bro[map[i][j]].x1:=i;
bro[map[i][j]].y1:=j;
bro[map[i][j]].step:=true;
end
else
begin
bro[map[i][j]].x2:=i;
bro[map[i][j]].y2:=j;
end;
end;
end;
readln;
end;
f[tail].x:=1;
f[tail].y:=1;
while(head<tail) do
begin
inc(head);
for i:=1 to 4 do
begin
xx:=f[head].x+dire[i][1];
yy:=f[head].y+dire[i][2];
if (xx>=1)and(xx<=n)and(yy>=1)and(yy<=m) then
begin
add:=true;
ch:=map[xx][yy];
if ch<>'1' then
begin
if (ch>='A') then
begin
map[xx][yy]:='1';
if (bro[ch].x1=xx)and(bro[ch].y1=yy) then
begin
xx:=bro[ch].x2;
yy:=bro[ch].y2;
end
else
begin
xx:=bro[ch].x1;
yy:=bro[ch].y1;
end;
end
else
map[xx][yy]:='1';
inc(tail);
f[tail].x:=xx;
f[tail].y:=yy;
f[tail].step:=f[head].step+1;
if (xx=n)and(yy=m) then
begin
if f[tail].step<min then
min:=f[tail].step;
can:=true;
end;
end;
end;
end;
end;
if can then
writeln(min)
else
writeln('No Solution.');
end.