当年写的错误宽搜对了,现在写了个正解只有50??
50分:
const tx:array[1..4,1..2] of longint=((1,0),(-1,0),(0,-1),(0,1));
ty:array[1..4,1..2] of longint=((1,1),(-1,-1),(1,-1),(-1,1));
var b,c:array[0..2250000] of integer;
f:array[0..1301,0..1301] of longint;
a:array[0..1301,0..1301] of word;
used:array[0..1301,0..1301] of boolean;
n,i,j:longint;ch:char;
procedure bfs;
var t,w,i,x1,y1,d:longint;
begin
t:=1;w:=4;
b[1]:=0;c[1]:=n;f[0,n]:=0;
b[2]:=n;c[2]:=0;f[n,0]:=0;
b[3]:=1;c[3]:=0;f[1,0]:=0;
while t<w do
begin
for i:=1 to 4 do
begin
d:=f[b[t],c[t]];
if (a[b[t],c[t]]=0) or (a[b[t],c[t]]=1) then
begin
x1:=b[t]+tx[i,1];
y1:=c[t]+tx[i,2];
d:=d+1;
end;
if (a[b[t],c[t]]=2) then
begin
x1:=b[t]+tx[i,1]*2;
y1:=c[t]+tx[i,2]*2;
d:=d+1;
end;
if (a[b[t],c[t]]=3) then
begin
x1:=b[t]+ty[i,1];
y1:=c[t]+ty[i,2];
d:=d+2;
end;
if (x1>0) and (y1>0) and (x1<=n) and (y1<=n) and (a[x1,y1]<>4) and (f[x1,y1]>d) then
begin
f[x1,y1]:=d;
if (used[x1,y1]=false) then
begin
b[w]:=x1;
c[w]:=y1;
inc(w);
used[x1,y1]:=true;
end;
end;
end;
used[b[t],c[t]]:=false;
inc(t);
end;
end;
begin
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(ch);
if ch='A' then a[i,j]:=1
else if ch='B' then a[i,j]:=2
else if ch='C' then a[i,j]:=3
else a[i,j]:=4;
f[i,j]:=maxlongint div 2;
end;
readln;
end;
if a[n,n]=4 then writeln('No answer')
else
begin
bfs;
if f[n,n]<>maxlongint div 2 then writeln(f[n,n])
else writeln('No answer');
end;
end.
100分???
const tx:array[1..4,1..2] of longint=((1,0),(-1,0),(0,-1),(0,1));
ty:array[1..4,1..2] of longint=((1,1),(-1,-1),(1,-1),(-1,1));
var b,c,h:array[0..2250000] of integer;
f:array[0..1301,0..1301] of boolean;
a:array[0..1301,0..1301] of word;
n,i,j,ans:longint;ch:char;
procedure bfs;
var t,w,i,x1,y1,d:longint;
begin
t:=1;w:=4;
b[1]:=0;c[1]:=n;
b[2]:=n;c[2]:=0;
b[3]:=0;c[3]:=1;
while t<w do
begin
for i:=1 to 4 do
begin
d:=h[t];
if (a[b[t],c[t]]=0) or (a[b[t],c[t]]=1) then
begin
x1:=b[t]+tx[i,1];
y1:=c[t]+tx[i,2];
d:=d+1;
end;
if (a[b[t],c[t]]=2) then
begin
x1:=b[t]+tx[i,1]*2;
y1:=c[t]+tx[i,2]*2;
d:=d+1;
end;
if (a[b[t],c[t]]=3) then
begin
x1:=b[t]+ty[i,1];
y1:=c[t]+ty[i,2];
d:=d+2;
end;
if (x1=n) and (y1=n) then
begin
ans:=d;
exit;
end;
if (x1>0) and (y1>0) and (x1<=n) and (y1<=n) and (a[x1,y1]<>4) and (f[x1,y1]=false) then
begin
f[x1,y1]:=true;
b[w]:=x1;
c[w]:=y1;
h[w]:=d;
inc(w);
end;
end;
inc(t);
end;
end;
begin
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(ch);
if ch='A' then a[i,j]:=1
else if ch='B' then a[i,j]:=2
else if ch='C' then a[i,j]:=3
else a[i,j]:=4;
end;
readln;
end;
if a[n,n]=4 then writeln('No answer')
else
begin
bfs;
if ans<>0 then writeln(ans)
else writeln('No answer');
end;
end.
好奇走过的不再走怎么拿的满分,明显数据有误