Cod sursa(job #2457756)

Utilizator razvan.maziluMazilu Razvan razvan.mazilu Data 18 septembrie 2019 17:32:21
Problema Jocul Flip Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.13 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++)
     {
        for(int j=1; j<=M; j++)
            printf("%d ",a[i][j]);
        printf("\n");
     }*/

    fclose(f);
    fclose(g);

    return 0;
}