Cod sursa(job #308778)

Utilizator rusu_raduRusu Radu rusu_radu Data 28 aprilie 2009 15:23:22
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream.h>
#include <math.h>
#define Nmax 16

long long int n, m, Smax, M[Nmax][Nmax];

void citire();
void determinare();
void afisare();

int main()
{
  citire();
  determinare();
  afisare();
  return 0;
}

void citire()
{
  ifstream fin("flip.in");
  int i, j;
  fin>>n>>m;
  for (i=0; i<n; i++)
    for (j=0; j<m; j++)
      fin>>M[i][j];
  fin.close();
}

void determinare()
{
  int i, j, k, ok=0;
  long long int S, Smin, Splus;
  while (!ok)
  {
  ok=1;
  for (i=0; i<n; i++)
    {
      Smin=0; Splus=0;
      for (j=0; j<m; j++)
	{
	  if (M[i][j]<0)
	    Smin+=abs(M[i][j]);
	  else
	    Splus+=M[i][j];
	}
      if (Smin>Splus)
	{
	  for (j=0; j<m; j++)
	    if (M[i][j]<0)
	      M[i][j]+=2*abs(M[i][j]);
	    else
	      M[i][j]-=2*M[i][j];
	  ok=0; S=0;
	  for (k=0; k<n; k++)
	    for (j=0; j<m; j++)
	      S+=M[k][j];
	  if (S>Smax)
	    Smax=S;
	}
    }
  for (i=0; i<m; i++)
    {
      Smin=0; Splus=0;
      for (j=0; j<n; j++)
	{
	  if (M[j][i]<0)
	    Smin+=abs(M[j][i]);
	  else
	    Splus+=M[j][i];
	}
      if (Smin>Splus)
	{
	  for (j=0; j<n; j++)
	    if (M[j][i]<0)
	      M[j][i]+=2*abs(M[j][i]);
	    else
	      M[j][i]-=2*M[j][i];
	  ok=0; S=0;
	  for (k=0; k<n; k++)
	    for (j=0; j<m; j++)
	      S+=M[k][j];
	  if (S>Smax)
	    Smax=S;
	}
    }
  }
}

void afisare()
{
  ofstream fout("flip.out");
  fout<<Smax<<'\n';
  fout.close();
}