Cod sursa(job #2640865)

Utilizator calinc2010Calin Coroian calinc2010 Data 8 august 2020 20:07:57
Problema Jocul Flip Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <iostream>
#include <fstream>

//JOCUL FLIP

using namespace std;
int n,m;
int countColChanges = 0;
int countLineChanges = 0;

int** readBoard(ifstream &inputFile){
    int height;
    int width;

    inputFile>>height>>width;

    n=height;
    m=width;

    int** board= new int*[n];
    for (int i = 0; i<n; i++){
        board[i]=new int[m];
        for(int j = 0; j<m; j++){
            inputFile>>board[i][j];
        }
    }
    return board;
}

void printBoard(int** board, int n, int m, ofstream &outputFile){

    int Result=0;
    for(int i = 0; i < n ; i++){
        for(int j = 0; j < m; j++){
            Result=Result+board[i][j];
            cout<<board[i][j]<<" ";
        }
        cout<<endl;
    }
    outputFile<<Result;
}

void changeLinePolarity(int** board, int lineIndex){
    for(int j = 0 ; j < m ; j++){
        board[lineIndex][j] = board[lineIndex][j]*(-1);
    }
}

void changeColumnPolarity(int** board, int columnIndex){
    for(int i = 0 ; i < n ; i++){
        board[i][columnIndex] = board[i][columnIndex]*(-1);
    }
}

void solveBoard(int** board, ofstream &outputFile){
    countColChanges = 0;
    countLineChanges = 0;

    int negPolarityLine = 0;
    int posPolarityLine = 0;

    int negPolarityCol = 0;
    int posPolarityCol = 0;

    bool doItAgain = true;
    bool iSaidDoItAgain = true;
    bool lineMightChange = false;
    bool columnMightChange = false;

    while(doItAgain){

        doItAgain=false;

        for(int i = 0; i < n; i++){

            columnMightChange = false;

            for(int j = 0; j<m ;j++){
                if(board[i][j]<0){
                    negPolarityLine+=board[i][j];
                }else{
                    posPolarityLine+=board[i][j];
                }
                negPolarityLine = 0;
                posPolarityLine = 0;
            }
            if (abs(negPolarityLine)>abs(posPolarityLine)){
                columnMightChange=true;
                changeLinePolarity(board, i);
                countLineChanges++;
            }
        }

        for(int j = 0; j<m ;j++){

            lineMightChange=false;

            for(int i = 0; i<n ;i++){
                if(board[i][j]<0){
                    negPolarityCol+=board[i][j];
                }else{
                    posPolarityCol+=board[i][j];
                }
            }
            if (abs(negPolarityCol)>abs(posPolarityCol)){
                lineMightChange = true;
                changeColumnPolarity(board, j);
                countColChanges++;
            }
            negPolarityCol = 0;
            posPolarityCol = 0;
        }

        if(lineMightChange || columnMightChange){
            doItAgain=true;
            lineMightChange = false;
            columnMightChange = false;
        }else{
            doItAgain=false;
        }
    }

    cout<<"LineChanges"<<countLineChanges;
    cout<<"ColumnChanges"<< countColChanges;
    cout<<endl;

    printBoard(board,n,m,outputFile);
}


int main()
{
    ifstream f("flip.in");
    ofstream g("flip.out");

    int **board;

    board = readBoard(f);
    solveBoard(board,g);
    return 0;
}