program Panak_rekurzia;

const nmax=10; mmax=10;
type mat=array[1..mmax,1..nmax] of integer;
var m,n:integer;
    mm:mat;
    kk,p:integer;
    ii,jj:integer;
    pr:integer;

procedure vypis(mm:mat; m,n:integer);
var i,j:integer;
begin
     for i:=1 to m do
     begin writeln;
           for j:=1 to n do
           write(mm[i,j]:3);
     end;
     writeln;
     readln;
end;{vypis}

procedure init(var mm:mat; m,n:integer);
var ii,jj:integer;
    kk:integer;
    p:integer;
begin
     for ii:=1 to m do
     for jj:=1 to n do mm[ii,jj]:=0;
     repeat
     kk:=random(m*n div 4);
     until kk>2;
     p:=0;
     while p<kk do
     begin
          ii:=1+random(m);
          jj:=1+random(n);
          if (mm[ii,jj]=0) and
             ((ii<>1) or (jj<>1)) and
             ((ii<>m) or (jj<>n)) then begin mm[ii,jj]:=1;
                                             p:=p+1;
                                       end;
      end;
end;{init}


procedure try(x,y:integer);
var xn,yn:integer;
    k:integer;
begin
     k:=0;
     repeat
           k:=k+1;
           case k of
           1: begin xn:=x+1; yn:=y end;
           2: begin xn:=x; yn:=y+1 end
           end;
           if (xn<=m) and (yn<=n) and (mm[xn,yn]=0) then
           begin
                mm[xn,yn]:=-2;
                if (xn<>m) or (yn<>n) then try(xn,yn)
                                      else begin vypis(mm,m,n); inc(pr); end;
                mm[xn,yn]:=0;
           end;
     until k>=2;
end;{try}



begin
     writeln('Pocet riadkov a stlpcov :');
     readln(m,n);
     randomize;
     init(mm,m,n);
     vypis(mm,m,n);
     mm[1,1]:=-2;
     try(1,1);
     writeln(' Pocet rieseni: ', pr);
     readln
end.
