Cod sursa(job #1987914)

Utilizator b2xdBilaniuc Dragos b2xd Data 1 iunie 2017 14:58:09
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>

using namespace std;

void citire(long x[17][17], int &n, int &m)
{
    ifstream f("flip.in");
    f>>n>>m;
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
    {
        f>>x[i][j];
    }
    f.close();
}
long long sum_line(long x[17][17],int m,int l)
{
    int i;
    long long s=0;
    for(i=1;i<=m;i++)
        s+=x[l][i];
    return s;
}
long long sum_col(long x[17][17],int n, int c)
{
    int i;
    long long s=0;
    for(i=1;i<=n;i++)
        s+=x[i][c];
    return s;
}
void switch_l(long x[17][17],int m, int l)
{
    int i;
    for(i=1;i<=m;i++)
        x[l][i]=-x[l][i];
}
void switch_c(long x[17][17], int n, int c)
{
    int i;
    for(i=1;i<=n;i++)
        x[i][c]=-x[i][c];
}

int main()
{
    int m,n,i,j,ok=1;
    long x[17][17];
    citire(x,n,m);
    cout<<n;
    long long s=0,l,c;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        s+=x[i][j];

    while(ok)
    {
        ok=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
        {
            l=sum_line(x,m,i);
            c=sum_col(x,n,j);
            if(s<s-2*l)
            {
                s=s-2*l;
                switch_l(x,m,i);
                c-=2*x[i][j];
                ok=1;
                if(s<s-2*c)
                {
                    s=s-2*c;
                    switch_c(x,n,j);
                }
            }
            if(s<s-2*c)
            {
                s=s-2*c;
                switch_c(x,n,j);
                ok=1;
                l-=2*x[i][j];
                if(s<s-2*l)
                {
                    s=s-2*l;
                    switch_l(x,m,i);
                }
            }
        }
    }
    ofstream g("flip.out");
    g<<s;
    g.close();
}