Cod sursa(job #20689)

Utilizator radamiRadu Patulescu radami Data 21 februarie 2007 21:44:17
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream.h>



long n,m,mat[50][50];

void citire (long &n,long &m)
 {
  std::ifstream f ("flip.in");
  f>>n>>m;
  for (int i=0;i<n;i++)
   for (int j=0;j<m;j++)
    f>>mat[i][j];
  f.close();
 }


int suma (long n,long m,long p[50][50])
 {
  long s=0;
  for (int i=0;i<n;i++)
   for (int j=0;j<m;j++)
    s+=p[i][j];
  return s;
 }

int sL (long m,long r,long p[50][50])
 {
  long s=0;
  for (int i=0;i<m;i++)
   s+=p[r][i];
  return s;
 }

int sC (long n,long r,long p[50][50])
 {
  long s=0;
  for (int i=0;i<n;i++)
   s+=p[i][r];
  return s;
 }

void intoarceL (long m,long j,long p[50][50])
 {
  int k;
  for (k=0;k<m;k++)
   p[j][k]*=-1;
 }

void intoarceC (long n,long i,long p[50][50])
 {
  int k;
  for (k=0;k<n;k++)
   p[k][i]*=-1;
 }

int flip ()
 {
  long p[50][50];
  long s=0,i,j,h,smax=0,s_int1=0,s_int2=0;

  for (i=0;i<m;i++)
   {

    for (int u=0;u<n;u++)
     for (int y=0;y<m;y++)
      p[u][y]=mat[u][y];
    if (i==0)
      s=suma(n,m,p);
     else
      s=smax;
    for (h=0;h<n;h++)
     p[h][m]=0;

    intoarceC (n,i,p);
     for (j=0;j<n;j++)
     {
      s_int1=suma(n,m,p);
      intoarceL(m,j,p);
      s_int2=suma(n,m,p);
      if (s_int1>s_int2)
       {
	intoarceL(m,j,p);
	p[j][m]=1;
       }
       else
        smax=s_int2;
      }
 /*    if (suma(n,m,p)>s)
      {
       smax=suma(n,m,p);
      }
     else
      {
       for (h=0;h<n;h++)
	if (p[h][m]==1)
	 intoarceL(m,h,p);
       intoarceC (n,i,p);
      }
 */
   }
  for (i=0;i<n;i++)
   {

    for (int u=0;u<n;u++)
     for (int y=0;y<m;y++)
      p[u][y]=mat[u][y];
    if (i==0)
      s=suma(n,m,p);
     else
      s=smax;
    for (h=0;h<m;h++)
     p[n][h]=0;

    intoarceL (n,i,p);
     for (j=0;j<m;j++)
      {
      s_int1=suma(n,m,p);
      intoarceC(m,j,p);
      s_int2=suma(n,m,p);
       if (s_int1>s_int2)
       {
	intoarceC(n,j,p);
	p[n][j]=1;
       }
       else
       smax=s_int2;
      }

/*    if (suma(n,m,p)>s)
      {
       smax=suma(n,m,p);
      }
     else
      {
       for (h=0;h<n;h++)
	if (p[n][h]==1)
	 intoarceC(n,h,p);
       intoarceL (m,i,p);
      }
*/
   }

  return s;
 }

int main ()
 {
 citire(n,m);
 std::ofstream g ("flip.out");
 g<<flip();
 g.close();
 return 0;
 }