MMATRIX - SHIFT Operator on Matrix

Tác giả: RR

Ngôn ngữ: Pascal

//Written by RR
{$r-,q-}
{$mode objfpc}
{$inline on}

uses math;
const
  FINP          =       '';
  FOUT          =       '';
var
  f1,f2         :       text;
  kq            :       array[1..7] of longint;
  sum,a         :       array[1..7,1..14] of longint;
  res,n         :       longint;

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
      for i:=1 to n do
      for j:=1 to n do
        read(f1,a[i,j]);
      for i:=1 to n do
        for j:=1 to n do
          a[i,n+j]:=a[i,j];
      for i:=1 to n do
        sum[1,i]:=a[1,i];
    end;
function update(i:longint):boolean; inline;
    var
      j:longint;
    begin
      for j:=1 to n do
      begin
        sum[i,j]:=sum[i-1,j]+a[i,j+kq[i]];
        if sum[i,j]>res then exit(false);
      end;
      exit(true);
    end;
procedure update2; inline;
    var
      j,ln:longint;
    begin
      ln:=-1000111000;
      for j:=1 to n do
        ln:=max(ln,sum[n,j]);
      res:=min(res,ln);
    end;
procedure duyet(i:longint); inline;
    var
      k:longint;
    begin
      for k:=0 to n do
        begin
          kq[i]:=k;
          if not update(i) then continue;
          if i<n then duyet(i+1)
          else update2;
          kq[i]:=0;
        end;
    end;

begin
  openF;
  read(f1,n);
  while (n>0) do
    begin
      inp; res:=1000111000;
      duyet(2);
      writeln(f2,res);
      read(f1,n);
    end;
  closeF;
end.

Download