这题数据什么时候改???
查看原帖
这题数据什么时候改???
77723
Grace_White楼主2021/8/1 10:22

当年写的错误宽搜对了,现在写了个正解只有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.

好奇走过的不再走怎么拿的满分,明显数据有误

2021/8/1 10:22
加载中...