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.