Cod sursa(job #1488657)

Utilizator NineshadowCarapcea Antonio Nineshadow Data 19 septembrie 2015 14:17:05
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream in("flip.in");
ofstream out("flip.out");

int v[16][16];
int n, m;

void flipy(int col)
{
    for(int i = 0; i < n; i++)
        v[i][col] *=-1;
}
void flipx(int line)
{
    for(int j = 0; j < m; j++)
        v[line][j] *= -1;
}

int sum()
{
    int s= 0;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            s+=v[i][j];
    return s;
}

int abs(int n)
{
    if(n < 0) return -1*n;
    return n;
}

bool checkCols()
{
    bool hasFlipped = false;
    int SumP, SumN;
    for(int j = 0; j < m; j++)
    {
        SumP = 0;
        SumN = 0;
        for(int i = 0; i < n; i++)
        {
            if(v[i][j] >= 0) SumP+=v[i][j];
            else SumN+=v[i][j];
        }
        if(abs(SumN)>SumP)
        {
            hasFlipped=true;
            flipy(j);
        }

    }
    return hasFlipped;
}
bool checkLines()
{
    bool hasFlipped = false;
    int SumP, SumN;
    for(int i = 0; i < n; i++)
    {
        SumP=0;
        SumN=0;
        for(int j = 0; j < m; j++)
        {
            if(v[i][j] >= 0) SumP+=v[i][j];
            else SumN+=v[i][j];
        }
        if(abs(SumN)>SumP)
        {
            hasFlipped=true;
            flipx(i);
        }

    }
    return hasFlipped;
}

int main()
{

    in >> n >> m;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < m; j++)
            in>>v[i][j];

    bool c = checkCols();
    bool l = checkLines();
    while(c || l)
    {
        c = checkCols();
        l = checkLines();
    }
    out << sum();
    return 0;
}