Cod sursa(job #68707)

Utilizator mlazariLazari Mihai mlazari Data 29 iunie 2007 11:22:52
Problema Jocul Flip Scor 20
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.29 kb
Program Flip;
var m,n : integer;
    T : array[1..16,1..16] of longint;
    L,C : array[1..16,0..1] of longint;
    S,Smax : longint;

procedure Citeste;
var Intrare : text;
    i,j : integer;
begin
  assign(Intrare,'flip.in');
  reset(Intrare);
  readln(Intrare,n,m);
  for i:=1 to n do
   begin
     L[i,0]:=0;
     L[i,1]:=0;
   end;
  for j:=1 to m do
   begin
     C[j,0]:=0;
     C[j,1]:=0;
   end;
  S:=0;
  for i:=1 to n do
   for j:=1 to m do
    begin
      read(Intrare,T[i,j]);
      S:=S+T[i,j];
      if T[i,j]<0 then
       begin
         L[i,0]:=L[i,0]-T[i,j];
         C[j,0]:=C[j,0]-T[i,j];
       end
       else
        begin
          L[i,1]:=L[i,1]+T[i,j];
          C[j,1]:=C[j,1]+T[i,j];
        end;
    end;
  close(Intrare);
end;

procedure Comuta(r,nr : integer);
var i : integer;
    aux : longint;
begin
  if r=0 then
   begin
     aux:=L[nr,0];
     L[nr,0]:=L[nr,1];
     L[nr,1]:=aux;
     for i:=1 to m do
      begin
        if T[nr,i]<0 then
         begin
           C[i,0]:=C[i,0]+T[nr,i];
           C[i,1]:=C[i,1]-T[nr,i];
         end
         else
          begin
            C[i,1]:=C[i,1]-T[nr,i];
            C[i,0]:=C[i,0]+T[nr,i];
          end;
        T[nr,i]:=-T[nr,i];
      end;
     S:=0;
     for i:=1 to m do S:=S+abs(C[i,0]-C[i,1]);
   end
   else
    begin
      aux:=C[nr,0];
      C[nr,0]:=C[nr,1];
      C[nr,1]:=aux;
      for i:=1 to n do
       begin
         if T[i,nr]<0 then
          begin
            L[i,0]:=L[i,0]+T[i,nr];
            L[i,1]:=L[i,1]-T[i,nr];
          end
          else
           begin
             L[i,1]:=L[i,1]-T[i,nr];
             L[i,0]:=L[i,0]+T[i,nr];
           end;
         T[i,nr]:=-T[i,nr];
       end;
      S:=0;
      for i:=1 to n do S:=S+abs(L[i,0]-L[i,1]);
    end;
end;

procedure Calculeaza;
var i : integer;
begin
  Smax:=S;
  for i:=1 to m do
   begin
     Comuta(1,i);
     if S>Smax then Smax:=S else Comuta(1,i);
   end;
  for i:=1 to n do
   begin
     Comuta(0,i);
     if S>Smax then Smax:=S else Comuta(0,i);
   end;
end;

procedure Scrie;
var Iesire : text;
begin
  assign(Iesire,'flip.out');
  rewrite(Iesire);
  write(Iesire,Smax);
  close(Iesire);
end;

begin
  Citeste;
  Calculeaza;
  Scrie;
end.