Cod sursa(job #959092)

Utilizator corneliu.pascuUPB Istrate Ghidel Pascu corneliu.pascu Data 7 iunie 2013 23:13:08
Problema Jocul Flip Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>

int n,m,a[200][200];
int max = 0;

void citire()
{
    freopen("royfloyd.in","r",stdin);
    freopen("royfloyd.out","w",stdout);

    int i, j;
    scanf("%d",&n);
    scanf("%d",&m);
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            {
                scanf("%d",&a[i][j]);
                max = max + a[i][j];
            }
}

void flip_linie(int linie)
{
    int i;
    for(i = 1;i <= m;i++)
        a[linie][i] *= -1;
}

void flip_coloana(int coloana)
{
    int i;
    for(i = 1;i <= n;i++)
        a[i][coloana] *= -1;
}

void check()
{
    int i,j;
    int check_aux = 0;
    for(i = 1;i <= m;i ++)
        {
            check_aux = 0;
            for(j = 1;j <= n;j ++)
                check_aux += a[i][j];
            if(check_aux < 0)
                flip_coloana(i);
        }
}

void check_max()
{
    int max_aux = 0;
    int i,j;
    for (i = 1; i <= n; i++)
        for (j = 1; j <= n; j++)
            max_aux = max_aux + a[i][j];
    if(max_aux > max)
        max = max_aux;
}

void backtrack(int linia)
{
    int i;
    for(i = 0; i <= 1; i++)
        {
            if(!i){
                check();
                check_max();
                if(linia != n)
                    backtrack(linia + 1);
            }

            if(i){
                flip_linie(i);
                check();
                check_max();
                if(linia != n)
                    backtrack(linia + 1);
            }
        }
}

int main()
{
    citire();
    backtrack(1);
    printf("%d\n",max);
}