Cod sursa(job #78885)

Utilizator Dr.OptixCristian Dinu Dr.Optix Data 20 august 2007 00:06:03
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
/*******************************************************************************
Problema   : Jocul Flip
Website    : InfoArena
Rezolvitor : Dr.Optix

Enunt:
Gigel a descoperit un nou joc pe care l-a numit "Flip". Acesta se joaca pe o 
tabla dreptunghiulara de dimensiuni N*M care contine numere intregi. Fiecare 
linie si fiecare coloana are un comutator care schimba starea tuturor 
elementelor de pe acea linie sau coloana, inmultindu-le cu -1. Scopul jocului 
este ca pentru o configuratie data a tablei de joc sa se actioneze asupra 
liniilor si coloanelor astfel incat sa se obtina o tabla cu suma elementelor cat
mai mare.

Cerinta
Dandu-se o configuratie pentru tabla "Flip", realizati un program care sa 
determine suma maxima pe care Gigel o poate obtine.

Date de Intrare
Prima linie a fisierului flip.in contine doua numere intregi N si M, separate 
prin cate un spatiu, care reprezinta dimensiunea tablei. Urmatoarele N linii
contin cate M numere intregi seperate prin cate un spatiu care descriu
configuratia tablei de joc.

Date de Iesire
Prima linie a fisierului flip.out contine un numar care va reprezenta suma
maxima pe care Gigel o poate obtine comutand liniile si coloanele tablei de joc.

Restrictii si precizari
    * 1 <= N, M <= 16
    * Tabla de joc contine numere intregi din intervalul [-1.000.000,1.000.000]
*******************************************************************************/

//includ fisierele necesare
#include <fstream.h>

//main() -- functia principala
int main()
{
    //deschid fisierele
    ifstream fin("flip.in"); ofstream fout("flip.out");
    
    //declar variabilele necesare
    long long mat[20][20],n,m,s1,s2,s;
    int i,j;
    
    //citesc datele
    fin>>n>>m;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            fin>>mat[i][j];
    
    //fac ce mi se cere
    for(j=0;j<m;j++)
    {
        s1=s2=0;
        for(i=0;i<n;i++)
        {
            s1+=mat[i][j]; s2+=-mat[i][j];
        }
        if(s1<s2)
            for(i=0;i<n;i++)
                mat[i][j]=-mat[i][j];
    }
    for(i=0;i<n;i++)
    {
        s1=s2=0;
        for(j=0;j<m;j++)
        {
            s1+=mat[i][j]; s2+=-mat[i][j];
        }
        if(s1<s2)
            for(j=0;j<m;j++)
                mat[i][j]=-mat[i][j];
    }
    s=0;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            s+=mat[i][j];
    
    /*/test scriu matricea obtinuta
    fout<<n<<" "<<m<<"\n";
    for(i=0;i<n;i++)
    {   for(j=0;j<m;j++)
            fout<<mat[i][j]<<" ";
        fout<<"\n";
    }*/
    //scriu rezultatul
    fout<<s;
    
    //inchid fisierele
    fin.close(); fout.close();
    return 0;
}