Cod sursa(job #2457748)

Utilizator razvan.maziluMazilu Razvan razvan.mazilu Data 18 septembrie 2019 17:18:39
Problema Jocul Flip Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <stdio.h>
#include <stdlib.h>

FILE *f,*g;
long a[17][17],b[17][17],s,smax;
int N,M,v[17],aux; 

int verif() // returneaza 0 daca toate elementele lui v sunt 1 si 1 in caz contrar
{
    for(int i = 1; i <= N; i++)
        if(v[i] == -1)
            return 1;
    return 0;
}

int suma(int j) // returneaza suma de pe coloana j
{
    int suma = 0;
    for(int i=1; i<=N; i++)
        suma += b[i][j];
    return suma;
}

void flip(int j) // face flip pe coloana j
{
    for(int i=1 ; i <= N; i++)
        b[i][j] = - b[i][j];
}

int main()
{
    int i,j;
    f = fopen("flip.in","r");
    g = fopen("flip.out","w");

    fscanf(f,"%d",&N);
    fscanf(f,"%d",&M);
    
    for(i=1; i<=N; i++)
        for(j=1; j<=M; j++)
            fscanf(f,"%ld",&a[i][j]);

    if(N > M) //optimizare...scade nr de operatii
    {
        for(i = 2; i <= N; i++)  // cazul in care N > M construim transpusa
            for(j = 1; j <= M &&  j < i; j++)
            {
                aux = a[i][j];
                a[i][j] = a[j][i];
                a[j][i] = aux;                
            }
        aux = N;
        N = M;
        M = aux;
    
    }

    for(int i = 1; i <= N; i++)
        v[i] = -1;
  
    v[i] = 0;
    while(verif())
    {
        for(i = 1; i<=N; i++)
            if(v[i] == 0)
            {
                v[i] = -1;
                break;
            }
            else
                if(v[i] == 1)
                    v[i] = -1;
                else
                {
                    v[i] = 1;
                    break;
                }

        for(i = 1; i <= N; i++) // construim b
            for(j = 1; j <= M; j++)
                b[i][j] = a[i][j]*v[i];

        for(j = 1; j <= M; j++)
            if(suma(j) < 0)
                flip(j);

        s = 0;
        for(i = 1; i <= N; i++) 
           for(j = 1; j <= M; j++)
                s += b[i][j];

        if(s > smax)
            smax = s;    
    }

    fprintf(g,"%ld",smax);

    /*for(int i=1; i<=N; i++)
    {
        s1=0;
        s2=0;
        
       for(int j=1; j<=M; j++)
       {
            s1+=a[i][j];
            s2+=(-1)*a[i][j];
             
       } 

       for(int j=1; j<=M; j++)
         if(s1<s2)
            a[i][j]=(-1)*a[i][j];  
    }

    for(int j=1; j<=M; j++)
    {
        s1=0;
        s2=0;
        
       for(int i=1; i<=N; i++)
       {
            s1+=a[i][j];
            s2+=(-1)*a[i][j];
             
       } 

       for(int i=1; i<=N; i++)
         if(s1<s2)
            a[i][j]=(-1)*a[i][j];  
    }

    for(int i=1; i<=N; i++)
       for(int j=1; j<=M; j++)
            s+=a[i][j];

    fprintf(g,"%d",s);

    for(int i=1; i<=N; i++)
     {
        for(int j=1; j<=M; j++)
            printf("%d ",a[i][j]);
        printf("\n");
     }*/

    fclose(f);
    fclose(g);

    return 0;
}