Const
  max_n = 4;

Type
  matrix = Array[1 .. max_n, 1 .. max_n] Of real;

Const
 a: matrix =
   ((2, 9, 9, 4),
    (2, -3, 12, 8),
    (4, 8, 3, -5),
    (1, 2, 6, 4));

function minusOne(n: integer): integer;
  begin
    minusOne := (1 - 2*Byte(Odd(n)));
  end;

function get_addr(i, j: integer;
         const n: integer): integer;
  begin
    get_addr := pred(i) * n + j
  end;

Function det(Var p; Const n: integer): real;
  Type
    matrix = Array[1 .. max_n * max_n] Of real;
  Var
    my_p: matrix Absolute p;
    pp: ^matrix;
    s: real;
    i, j, curr: integer;
  Begin
    s := 0.0;

    If n = 2 Then
      Begin
        det := my_p[1]*my_p[4] - my_p[2]*my_p[3]; exit
      End;

    For i := 1 To n Do
      Begin
        GetMem(pp, Sqr(Pred(n)) * SizeOf(real));
        curr := 1;
        For j := 1 To n Do
          If j <> i Then
            Begin
              move(my_p[get_addr(j, 2, n)], pp^[get_addr(curr, 1, Pred(n))],
                   pred(n) * SizeOf(real));
              inc(curr);
            End;

        s := s + minusOne(Succ(i)) * my_p[get_addr(i, 1, n)] *
                 det(pp^, Pred(n));
        FreeMem(pp, Sqr(Pred(n)) * SizeOf(real))
      End;

    det := s
  End;

begin
  WriteLn( det(a, 4):0:0 );
end.