Cod sursa(job #1701779)

Utilizator suto_tamasSuto Tamas suto_tamas Data 14 mai 2016 02:15:40
Problema Jocul Flip Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <stdio.h>
#include <stdlib.h>
int i;
int flip(int** a,int n,int m,int max,int n1)
{
    if(n1<=n)
    {
        int i,j,s=0,max2=0;
        for(i=n1; i<n; i++)
        {
            for(j=0; j<m; j++)
            {
                s=s+a[i][j];
            }
            if (s<0)
            {
                for(j=0; j<m; j++)
                {
                    a[i][j]*=-1;
                }
            }
            max=flip(a,n,m,max,n1+1);
            max=flip2(a,n,m,max,0);
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                {
                    max2+=a[i][j];
                }
            }
            if (max2>max)
            {
                max=max2;
            }
            return max;


        }
    }
}

int flip2(int** a,int n,int m,int max,int m1)
{
    if (m1<=m)
    {
        int i,j,s=0,max2=0;
        for(j=m1; j<m; j++)
        {
            for (i=0; i<n; i++)
            {
                s=s+a[i][j];
            }
            if (s<0)
            {
                for(i=0; i<n; i++)
                {
                    a[i][j]*=-1;
                }
            }
            max=flip2(a,n,m,max,m1+1);
            for(i=0; i<n; i++)
            {
                for(j=0; j<m; j++)
                {
                    max2+=a[i][j];
                }
            }
            if (max2>max)
            {
                max=max2;
            }
            return max;
        }
    }
}
int** Create(int n,int m)
{
    int **tb;
    tb=(int**)malloc(n*sizeof(int*));
    for(i=0; i<n; i++)
    {
        tb[i]=(int*)malloc(m*sizeof(int));
    }
    return tb;
}
void Destroy(int**tb,int n)
{
    for (i=0; i<n; i++)
    {
        free(tb[i]);
    }
    free(tb);
}
int main()
{
    FILE *in,*out;
    in=fopen("flip.in","rt");
    out=fopen("flip.out","wt");
    int n,m,i,j,**tb,max=0;
    fscanf(in,"%i%i",&n,&m);
    tb=Create(n,m);
    for(i=0; i<n; i++)
    {
        for(j=0; j<m; j++)
        {
            fscanf(in,"%i",&tb[i][j]);
            max+=tb[i][j];
        }
    }
    max=flip(tb,n,m,max,0);
    fprintf(out,"%i",max);
    fclose(in);
    fclose(out);
    Destroy(tb,n);
    return 0;
}