Cod sursa(job #2003053)

Utilizator trandafirpatrickTrandafir Patrick trandafirpatrick Data 21 iulie 2017 17:01:21
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 kb
/*
Jocul Flip

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.
*/

#include <iostream>
#include <fstream>

using namespace std;

void printMat(int ** mat,int w,int h){
    cout<<endl;
 for(int i = 0;i<w;i++){
        for(int j = 0;j<h;j++){
            cout<<mat[i][j]<<" ";
        }
        cout<<endl;
    }
}

int matSum(int ** mat, int w , int h){
    int total=0;
     for(int i = 0;i<w;i++){
            for(int j = 0;j<h;j++){
                total+=mat[i][j];
            }
        }
        return total;
}

 int * sum(int **mat,int w,int h){
    int *s = new int[w+h]();
    for(int i = 0;i<w;i++){
        for(int j = 0;j<h;j++){
            s[i]+=mat[i][j];
            s[w+j]+=mat[i][j];
        }
    }
    return s;
}

void flip(int **mat , int w,int h,int nr){
if(nr>=w){
    for(int i = 0 ; i < w;i++)
        mat[i][nr-w]*=-1;
    }
else{
    for(int i = 0 ; i < h;i++)
        mat[nr][i]*=-1;
    }
}

int getMin(int * arr,int l){
    int min = arr[0];
    int pos=0;
    for(int i = 1 ; i < l; i++){
        if(arr[i]<min){
            pos=i;
            min=arr[i];
        }
    }
    if(min>=0)
        return -1;
    else
        return pos;
}

int main()
{
    ifstream input ("flip.in");
    ofstream output("flip.out");

    int w,h,p;
    int **mat;
    int * s;
    input>>w>>h;
    mat=new int* [w];
    for(int i = 0 ; i < w ; i++){
        mat[i]=new int[h];
        for(int j = 0;j<h;j++){
            input>>mat[i][j];
        }
    }
    printMat(mat,w,h);
    do{
        s=sum(mat,w,h);
        p = getMin(s,w+h);
        if(p>=0){
            flip(mat,w,h,p);
            printMat(mat,w,h);
        }
        delete []s;
    }while(p>=0);

    output<<matSum(mat,w,h);

    return 0;
}