Cod sursa(job #249522)

Utilizator loginLogin Iustin Anca login Data 28 ianuarie 2009 17:45:46
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
# include <fstream>
using namespace std;
int n, m, a[100][100], b[100][100];

ofstream fout ("flip.out");
void verlin (long long [][100]);
void vercol (long long [][100]);
void init (int);
void comutac (int);
void comutal (int);
long long ver1 (int x[100][100], long long l[2][100], long long c[2][100]);
long long ver2 (int x[100][100], long long c[2][100], long long l[2][100]); 

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

int main ()
{
    long long c[2][100], l[2][100];
    long long  rez1, rez2;
    citire ();
    rez1=ver1(a, l, c);
    rez2=ver2(b, c, l);
    if (rez1>rez2)
       fout<<rez1;
    else
        fout<<rez2;
    fout.close ();
    return 0;
}

long long ver1 (int x[100][100], long long l[2][100], long long c[2][100])
{
     long long s=0;
     int i, j;
     verlin(l);
     vercol(c);
     for (i=1;i<=n;i++)
         for (j=1;j<=m;j++)
             s+=x[i][j];
    return s;
}
long long ver2 (int x[100][100], long long c[2][100], long long l[2][100])
{
     long long s=0;
     int i, j;
     vercol(c);
     verlin(l);
     for (i=1;i<=n;i++)
         for (j=1;j<=m;j++)
             s+=a[i][j];
     return s;
}
void init (long long b[][100], int ce)
{
     int i, j;
     if (ce==1)
     {
         for (i=1;i<=2;i++)
             for (j=1;j<=n;j++)    
                 b[i][j]=b[i][j]*0;
     }
     else
         if (ce==2)
         {
            for (i=1;i<=2;i++)
                for (j=1;j<=m;j++)    
                    b[i][j]=b[i][j]*0;
         }             
}
void verlin (long long l[][100])
{
    int i, j, pp=0;
    while (!pp)
    {
          pp=1;
          init(l, 1);  
          for (i=1;i<=n;i++)
              for (j=1;j<=m;j++)  
                  if (a[i][j]<0)  
                    l[2][i]+=a[i][j];
                  else
                    l[1][i]+=a[i][j];
          for (i=1;i<=n;i++)
              if (l[2][i]+l[1][i]<0)
                 pp=0, comutal(i);
    }
}
void vercol (long long c[][100])
{
     int i, j, pp=0;
     while (!pp)
     {
           pp=1;
           init (c, 2);
           for (i=1;i<=n;i++)
               for (j=1;j<=m;j++)
                   if (a[i][j]<0)
                      c[2][j]+=a[i][j];
                   else
                       c[1][j]+=a[i][j];
           for (j=1;j<=m;j++)
               if (c[2][j]+c[1][j]<0)
                  pp=0, comutac (j);
     }
}
void comutal (int i)
{
     int j;
     for (j=1;j<=m;j++) 
         a[i][j]=-1*a[i][j];     
}
void comutac (int j)
{
     int i;
     for (i=1;i<=n;i++)
         a[i][j]=-1*a[i][j];
}