Cod sursa(job #1969666)

Utilizator TomaAlimosToma AlimoS TomaAlimos Data 18 aprilie 2017 16:20:28
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include<fstream>
#include<iomanip>
using namespace std;
fstream fin("flip.in",ios::in),
        fout("flip.out",ios::out);
long a[18][18];

void read(int nl, int nc);
int sum_line(int l, int nc);
int sum_col(int c, int nl);
int total(int nc);
int suma(int nl, int nc);
void flip_line(int l, int nc);
void flip_col(int nl, int c);
void min_value(int nl, int nc)
{
    int i,j;
    long m;
    m=a[1][0];a[nl+1][0]=1;a[0][nc+1]=0;
    for(i=1;i<=nl;i++)
        if(a[i][0]<m)
        {
            m=a[i][0];
            a[nl+1][0]=i;
            a[0][nc+1]=0;
        }
    for(j=1;j<=nc;j++)
        if(a[0][j]<m)
        {
            m=a[0][j];
            a[nl+1][0]=0;
            a[0][nc+1]=j;
        }
    a[nl+1][nc+1]=m;
}
void init_sums(int nl, int nc)
{
    int i,j;
    for(i=1;i<=nl;i++)
        a[i][0]=sum_line(i,nc);
    for(j=1;j<=nc;j++)
        a[0][j]=sum_col(j,nl);
}
void write(int nl, int nc)
{
    int i,j;
    for(i=0;i<=nl+1;i++)
    {
        for(j=0;j<=nc+1;j++)
            fout<<setw(5)<<right<<a[i][j]<<' ';
        fout<<endl;
    }
}

int main()
{
    int n,m,i,j;
    long S;
    fin>>n>>m;
    read(n,m);
    init_sums(n,m);
    min_value(n,m);
    while(a[n+1][m+1]<0)
    {
        if(a[n+1][0]!=0)
        {
            flip_line(a[n+1][0],m);
            init_sums(n,m);
            min_value(n,m);
        }
        if(a[0][m+1]!=0)
        {
            flip_col(a[0][m+1],n);
            init_sums(n,m);
            min_value(n,m);
        }
    }
    //write(n,m);
    fout<<total(m);
    fin.close();
    fout.close();
    return 0;
}

void read(int nl, int nc)
{
    int i,j;
    for(i=1;i<=nl;i++)
        for(j=1;j<=nc;j++)
            fin>>a[i][j];
}
int sum_line(int l, int nc)
{
    long s=0;
    for(int j=1;j<=nc;j++)
        s+=a[l][j];
    return s;
}

int sum_col(int c, int nl)
{
    long s=0;
    for(int i=1;i<=nl;i++)
        s+=a[i][c];
    return s;
}

void flip_line(int l, int nc)
{
    int j;
    for(j=1;j<=nc;j++)
    {
        a[l][j]*=(-1);
    }
}

void flip_col(int c, int nl)
{
    int i;
    for(i=1;i<=nl;i++)
        a[i][c]*=(-1);
}



int total(int nc)
{
    int j;
    long s=0;
    for(j=1;j<=nc;j++)
        s+=a[0][j];
    return s;
}