Cod sursa(job #601060)

Utilizator DarkWishMasterCebotari Vlad DarkWishMaster Data 4 iulie 2011 18:47:30
Problema Jocul Flip Scor 20
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.6 kb
type  matrice=array[1..16,1..16] of longint;
var a:matrice; x,lim:char; y,max,N,M:int64; F,G:text; i,j,lim2:byte;
 procedure CautaCandidat;
 var max,neg,pos:int64; i,j:byte; k:char;
  begin
   max:=0;
   for j:=1 to M do begin
    neg:=0; pos:=0; k:='c';
      for i:=1 to N do
      if a[i,j]<0 then neg:=neg+a[i,j]
       else pos:=pos+a[i,j];
    if (abs(neg)-abs(pos)>max) and ((lim<>k) or (j<>lim2)) then
     begin
       x:='c';
       y:=j;
       max:=abs(neg)-abs(pos);
     end;
   end;
   k:='l';
     for i:=1 to N do  begin
    neg:=0;    pos:=0;
      for j:=1 to M do
      if a[i,j]<0 then neg:=neg+a[i,j]
       else pos:=pos+a[i,j];
    if (abs(neg)-abs(pos)>max)  and ((lim<>k) or (j<>lim2)) then
     begin
       x:='l';
       y:=i;
       max:=abs(neg)-abs(pos);
     end;
   end;
 end;
 procedure Flip(x:char; y:integer);
 var i,j:byte;
  begin
   if x='l' then
    for j:=1 to M do
     a[y,j]:=a[y,j]*-1;
   if x='c' then
    for i:=1 to N do
     a[i,y]:=a[i,y]*-1;
 end;
 function  Suma(a:matrice):int64;
 var i,j:integer; S:int64;
  begin
  S:=0;
   for i:=1 to N do
    for j:=1 to M do
     S:=S+a[i,j];
   Suma:=S;
  end;
Begin
Assign(F, 'flip.in');
 reset(F);
 readln(F, N,M);
 for i:=1 to N do
  begin
    for j:=1 to M do
    read(F, a[i,j]);
 readln(F);
 end;
 close(F);
 for i:=1 to N*M do begin
 CautaCandidat;
 Flip(x,y);
  if Suma(a)<max then begin
   Flip(x,y);
   lim:=x;
   lim2:=y;
 end else max:=suma(a);
 end;
 assign(G, 'flip.out');
 rewrite(G);
write(G, max);
writeln(max);
close(G);
readln;
end.