ALADDIN - Aladdin

Tác giả: RR

Ngôn ngữ: Pascal

{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=401;
var
  f1,f2:text;
  test,t,n:longint;
  a,sl:array[1..MAXN,1..MAXN] of longint;
  ok:boolean;
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,j:longint;
begin
  read(f1,n);
  for i:=1 to n-1 do
  for j:=1 to n-1 do
    read(f1,sl[i,j]);
end;
procedure ans;
var
  i,j:longint;
begin
  for i:=1 to n do
    begin
      for j:=1 to n do write(f2,a[i,j],' ');
      writeln(f2);
    end;
  closeF;
  halt;
end;
procedure dienSo(u:longint);
var
  i,j,count:longint;
begin
  ok:=true;
  for i:=2 to n do
    begin
      j:=u+1-i;
      if (j<2) or (j>n) then continue;
      count:=a[i-1,j-1]+a[i-1,j]+a[i,j-1];
      if count=sl[i-1,j-1] then a[i,j]:=0
      else if count+1=sl[i-1,j-1] then a[i,j]:=1
      else ok:=false;
    end;
end;
procedure xoaSo(u:longint);
var
  i,j:longint;
begin
  for i:=2 to n do
    begin
      j:=u+1-i;
      if (j<2) then continue;
      a[i,j]:=0;
    end;
end;
procedure try(u:longint);
var
  i,j:longint;
begin
  for i:=0 to 1 do
  if (u<=n) or (i=0) then
  for j:=0 to 1 do
  if (u<=n) or (j=0) then
    begin
      a[1,u]:=i; a[u,1]:=j;
      dienSo(u);
      if ok then
        begin
          if u=n+n then ans
          else try(u+1)
        end;
      xoaSo(u); a[1,u]:=0; a[u,1]:=0;
    end;
end;
procedure solve;
begin
  a[1,1]:=0;
  try(2);
  a[1,1]:=1;
  try(2);
end;
begin
  openF;
  inp;
  solve;
  writeln(f2,'No solution');
  closeF;
end.

Download