Cod sursa(job #58624)

Utilizator adrianraduleaRadulea Adrian adrianradulea Data 6 mai 2007 17:18:29
Problema Jocul Flip Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.31 kb
var f,g:text;
    n,m,k:-17..16;
    i,j:0..16;
    st:array[1..32] of -16..16;
    a,b:array[1..16,1..16] of longint;
    as,ev:boolean;
    s,max:longint;
procedure reinit;
begin
for i:=1 to n do for j:=1 to m do b[i,j]:=a[i,j];
end;
procedure citire;
begin
assign(f,'flip.in'); reset(f);
assign(g,'flip.out'); rewrite(g);
read(f,n,m);
for i:=1 to n do
  for j:=1 to m do read(f,a[i,j]);
end;
procedure init;
begin
st[k]:=-m-1;
end;
procedure succesor;
begin
if (st[k]<n) and (k<=n) then begin
  st[k]:=st[k]+1;
  as:=true;
end
           else as:=false;
end;
procedure valid;
begin
ev:=true;
for i:=1 to k-1 do if (st[i]=st[k]) or (st[i]=0) then ev:=false;
end;
procedure tipar;
begin
s:=0;
reinit;
for i:=1 to k do
  if st[i]>0 then for j:=1 to m do b[st[i],j]:=-b[st[i],j]
             else for j:=1 to n do b[j,-st[i]]:=-b[j,-st[i]];
for i:=1 to n do for j:=1 to m do s:=s+b[i,j];
if s>max then max:=s;
end;
begin
citire;
max:=-256000001;
k:=1;
init;
while k>0 do begin
  repeat
    succesor;
    if as then valid;
  until (not as) or (as and ev);
  if as then               begin
                             tipar;
                             k:=k+1;
                             init;
                           end
        else k:=k-1;
end;
write(g,max);
close(g);
end.