魔兽世界
这题应该宽搜的,不过我觉得写spfa更好些,调试费了点劲,其实这题挺简单的!
代码:
const
dx:array[1..4] of longint=(-1,0,0,1);
dy:array[1..4] of longint=(0,-1,1,0);
type
link=^node;
node=record
x:longint;
next:link;
end;
var
g:array[1..10000] of link;
dist:array[1..10000] of longint;
v:array[1..10000] of boolean;
q:array[0..10000] of longint;
gx,gy:array['A'..'Z'] of longint;
map:array[0..101,0..101] of char;
n,m:longint;
procedure connect(a,b:longint);
var
p:link;
begin
new(p);
p^.x:=b;
p^.next:=g[a];
g[a]:=p;
end;
function num(x,y:longint):longint;
begin
num:=(x-1)*m+y;
end;
procedure spfa;
var
top,last,i:longint;
p:link;
begin
for i:=1 to n*m do dist[i]:=maxlongint; dist[1]:=0;
fillchar(v,sizeof(v),false); v[1]:=true;
q[1]:=1;
top:=0; last:=1;
while top<>last do begin
inc(top); top:=top mod (n*m);
v[q[top]]:=false;
p:=g[q[top]];
while p<>nil do begin
if dist[p^.x]>dist[q[top]]+1 then begin
dist[p^.x]:=dist[q[top]]+1;
if not v[p^.x] then begin
inc(last); last:=last mod (n*m);
q[last]:=p^.x;
v[p^.x]:=true;
end;
end;
p:=p^.next;
end;
end;
if dist[n*m]<>maxlongint then write(dist[n*m]) else write('No Solution.');
end;
procedure main;
var
i,j,k:longint;
c:char;
begin
readln(n,m);
fillchar(gx,sizeof(gx),0);
fillchar(gy,sizeof(gy),0);
for i:=1 to n do begin
for j:=1 to m do
read(map[i,j]);
readln;
end;
for i:=1 to n do begin
for j:=1 to m do begin
c:=map[i,j];
for k:=1 to 4 do
if (i+dx[k]>=1)and(i+dx[k]<=n)and(j+dy[k]>=1)and(j+dy[k]<=m)and(map[i+dx[k],j+dy[k]]='0') then
connect(num(i,j),num(i+dx[k],j+dy[k]));
if c in ['A'..'Z'] then
if gx[c]=0 then begin
gx[c]:=i; gy[c]:=j;
end else begin
for k:=1 to 4 do begin
if (i+dx[k]>=1)and(i+dx[k]<=n)and(j+dy[k]>=1)and(j+dy[k]<=m) then
connect(num(i+dx[k],j+dy[k]),num(gx[c],gy[c]));
if (gx[c]+dx[k]>=1)and(gx[c]+dx[k]<=n)and(gy[c]+dy[k]>=1)and(gy[c]+dy[k]<=m) then
connect(num(gx[c]+dx[k],gy[c]+dy[k]),num(i,j));
end;
end;
end;
end;
spfa;
end;
begin
main;
end.