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.