VKNIGHTS - Quân mã

Tác giả: RR

Ngôn ngữ: Pascal

{$R+,Q+}
const
  FINP='';
  FOUT='';
  MAXN=1111;
  cal:array[0..7] of longint=(0,1,1,2,1,2,2,3);
var
  n:longint;
  d,count:array[1..MAXN,0..7,0..7] of longint;
  f1,f2:text;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1); close(f2);
end;
procedure inp;
var
  i,u,j:longint;
begin
  read(f1,n);
  read(f1,u);
  if n=1 then
    begin
      if u=0 then writeln('3 1')
      else writeln('2 1');
      halt;
    end;
  case u of
    1: for j:=0 to 7 do
         begin
           d[2,1,j]:=-1;
           d[2,3,j]:=-1;
           d[2,5,j]:=-1;
           d[2,7,j]:=-1;
         end;
    2: for j:=0 to 7 do
         begin
           d[2,2,j]:=-1;
           d[2,3,j]:=-1;
           d[2,6,j]:=-1;
           d[2,7,j]:=-1;
         end;
    3: for j:=0 to 7 do
         begin
           d[2,4,j]:=-1;
           d[2,5,j]:=-1;
           d[2,6,j]:=-1;
           d[2,7,j]:=-1;
         end;
  end;
  for i:=2 to n do
    begin
      read(f1,u);
      case u of
        1: begin
             for j:=0 to 7 do
               begin
                 d[i+1,1,j]:=-1;
                 d[i+1,3,j]:=-1;
                 d[i+1,5,j]:=-1;
                 d[i+1,7,j]:=-1;
               end;
             for j:=0 to 7 do
               begin
                 d[i,j,1]:=-1;
                 d[i,j,3]:=-1;
                 d[i,j,5]:=-1;
                 d[i,j,7]:=-1;
               end;
           end;
        2: begin
             for j:=0 to 7 do
               begin
                 d[i+1,2,j]:=-1;
                 d[i+1,3,j]:=-1;
                 d[i+1,6,j]:=-1;
                 d[i+1,7,j]:=-1;
               end;
             for j:=0 to 7 do
               begin
                 d[i,j,2]:=-1;
                 d[i,j,3]:=-1;
                 d[i,j,6]:=-1;
                 d[i,j,7]:=-1;
               end;
           end;
        3: begin
             for j:=0 to 7 do
               begin
                 d[i+1,4,j]:=-1;
                 d[i+1,5,j]:=-1;
                 d[i+1,6,j]:=-1;
                 d[i+1,7,j]:=-1;
               end;
             for j:=0 to 7 do
               begin
                 d[i,j,4]:=-1;
                 d[i,j,5]:=-1;
                 d[i,j,6]:=-1;
                 d[i,j,7]:=-1;
               end;
           end;
      end;
    end;
end;
procedure ans;
var
  kq,sl,i1,i2:longint;
begin
  kq:=0;
  for i1:=0 to 7 do
  for i2:=0 to 7 do
    if d[n,i1,i2]>kq then kq:=d[n,i1,i2];
  write(f2,kq); sl:=0;
  for i1:=0 to 7 do
  for i2:=0 to 7 do
    if d[n,i1,i2]=kq then inc(sl,count[n,i1,i2]);
  writeln(f2,' ',sl);
end;
function check1(u,v:longint):boolean;
begin
  if (u mod 2=1) and (v>=4) then exit(false);
  if (u>=4) and (v mod 2=1) then exit(false);
  exit(true);
end;
function check2(u,v:longint):boolean;
begin
  if (u mod 2=1) and (v=2) then exit(false);
  if (u mod 2=1) and (v=3) then exit(false);
  if (u mod 2=1) and (v=6) then exit(false);
  if (u mod 2=1) and (v=7) then exit(false);
  if (u>=4) and (v=2) then exit(false);
  if (u>=4) and (v=3) then exit(false);
  if (u>=4) and (v=6) then exit(false);
  if (u>=4) and (v=7) then exit(false);
  if (v mod 2=1) and (u=2) then exit(false);
  if (v mod 2=1) and (u=3) then exit(false);
  if (v mod 2=1) and (u=6) then exit(false);
  if (v mod 2=1) and (u=7) then exit(false);
  if (v>=4) and (u=2) then exit(false);
  if (v>=4) and (u=3) then exit(false);
  if (v>=4) and (u=6) then exit(false);
  if (v>=4) and (u=7) then exit(false);
  exit(true);
end;
procedure solve;
var
  i1,i2,i3,i:longint;
begin
  for i1:=0 to 7 do
  for i2:=0 to 7 do
    if check1(i1,i2)=false then
        for i:=2 to n do
          d[i,i1,i2]:=-1;
  for i1:=0 to 7 do
  for i2:=0 to 7 do
  if d[2,i1,i2]=0 then
    begin
      d[2,i1,i2]:=cal[i1]+cal[i2];
      count[2,i1,i2]:=1;
    end;
  for i:=2 to n-1 do
  for i1:=0 to 7 do
  for i2:=0 to 7 do
    if d[i,i1,i2]>0 then
      for i3:=0 to 7 do
      if d[i+1,i2,i3]>=0 then
        if check2(i1,i3) and check1(i2,i3) then
          if d[i,i1,i2]+cal[i3]>d[i+1,i2,i3] then
            begin
              d[i+1,i2,i3]:=d[i,i1,i2]+cal[i3];
              count[i+1,i2,i3]:=count[i,i1,i2];
            end
          else if d[i,i1,i2]+cal[i3]=d[i+1,i2,i3] then
            begin
              d[i+1,i2,i3]:=d[i,i1,i2]+cal[i3];
              inc(count[i+1,i2,i3],count[i,i1,i2]);
            end;
end;
begin
  openF;
  inp;
  solve;
  ans;
  closeF;
end.

Download