Cod sursa(job #105171)

Utilizator OvidiuAndrusAndrus Ovidiu OvidiuAndrus Data 17 noiembrie 2007 10:49:38
Problema Jocul Flip Scor 10
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.05 kb
type MATRICE = array[1..16, 1..16] of longint;

var n,m  : byte;
    A    : MATRICE;
    smax : longint;

{procedure Afisare(A:MATRICE);
var i,j:byte;
begin
     for i:=1 to n do
         begin
              for j:=1 to m do Write(A[i,j]:3);
              Writeln;
         end;
end;}

function Pow(n,p:byte):longint;
begin
     if p=0 then Pow:=1 else Pow := n * Pow(n,p-1);
end;

procedure Citire;
var f : text; i,j:byte;
begin
     Assign(f,'flip.in'); Reset(f);
     Readln(f,n,m);
     for i:=1 to n do for j:=1 to m do Read(f,a[i,j]);
     Close(f);
end;

procedure DecToBin(x : longint; var s : string);
begin
     s:='';
     while x <> 0 do
           begin
                case x mod 2 of
                     0 : s:='0'+s;
                     1 : s:='1'+s;
                end;
                x := x div 2;
           end;
end;

function DoSum(A:MATRICE; si, sj:string):longint;
var i,j:byte; s:longint;
begin
     for i:=1 to n do
         case si[i] of
              '1' : for j:=1 to m do A[i,j]:=-A[i,j];
         end;

     for j:=1 to m do
         case sj[j] of
              '1' : for i:=1 to n do A[i,j]:=-A[i,j];
         end;
     {Writeln('Ca sa fac suma >'); Afisare(A);}
     s:=0;
     for i:=1 to n do for j:=1 to m do s:=s+A[i,j];
     DoSum := s;
end;

procedure Solve(lmax, cmax:longint);
var i,j:longint; si, sj:string; x : byte;
    suma : longint;
begin
     smax := -maxlongint;
     for i:=0 to lmax-1 do
         for j:=0 to cmax-1 do
             begin
                  DecToBin(i,si); DecToBin(j,sj);
                  for x:=length(si)+1 to n do si:='0'+si;
                  for x:=length(sj)+1 to m do sj:='0'+sj;
                  {Afisare(A); Writeln(si,'-------',sj);}
                  suma := DoSum(A, si, sj);
                  if suma > smax then smax := suma;
                  {write(suma); readln;}
             end;
end;

var f : text;

begin
     Citire;
     Solve(Pow(2,n), Pow(2,m));
     Assign(f,'flip.out'); ReWrite(f); Writeln(f,smax); Close(f);
end.