Program Sudoku;
const n=3; nn=n*n;
var a:array[0..nn-1,0..nn-1]of char;
    gasit:boolean;
    k,l:integer;
    f:text;
procedure cit;
begin
 assign(f,'Sudoku.txt');
 reset(f);
 for k:=0 to nn-1 do
  begin
   for l:=0 to 8 do begin
    read(f,a[k,l]);
    if a[k,l]=' 'then a[k,l]:='0';
   end;
   readln(f);
  end;
 close (f);
end;

Procedure Scris;
begin
 assign(f,'SuDoKu.rez');
 rewrite(f);
 for k:=0 to nn-1 do
  begin
   for l:=0 to nn-1 do write(f,a[k,l]);
   writeln(f);
  end;
 close(f);
end;

Function Bun(i,j:integer):boolean;
var i1,j1,i0,j0:integer;
begin
 bun:=true;
 for i1:=0 to nn-1 do
  if (i1<>i)and(a[i1,j]=a[i,j])then bun:=false;
 for j1:=0 to nn-1 do
  if (j1<>i)and(a[i,j1]=a[i,j])then bun:=false;
 i0:=(i div n)*n;
 j0:=(j div n)*n;
 for i1:=i0 to i0+n-1 do
  for j1:=j0 to j0+n-1 do
   if(i1<>i)and(j1<>j)and(a[i1,j1]=a[i,j])then bun:=false;
end;

Procedure Gen(i,j:integer);
begin
 if not gasit then
  if i>(nn-1) then
   begin
    gasit:=true;
    Scris;
   end
  else
   if a[i,j]<>'0' then gen(i+(j+1)div 9, (j+1)mod 9)
   else begin
    while a[i,j]<>chr(nn+48)do begin
     a[i,j]:=succ(a[i,j]);
     if bun(i,j)then gen (i+(j+1)div 9, (j+1)mod 9);
    end;
    a[i,j]:='0';
   end;
end;

begin
 cit;
 for k:=0 to nn-1 do begin
  for l:=0 to nn-1 do write(a[k,l]:2);
  writeln;
 end;
 gasit:=false;
 gen(0,0);

 writeln;
 for k:=0 to nn-1 do begin
  for l:=0 to nn-1 do write(a[k,l]:2);
  writeln;
 end;
 readln;
end.
