Cod sursa(job #858806)

Utilizator SPDionisSpinei Dionis SPDionis Data 19 ianuarie 2013 13:39:26
Problema Jocul Flip Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.11 kb
#include<stdio.h>

int n,m,a[16][16],b[32],snou,svechi=0;


void init()  //intializeaza matricea b[n+m] care contine numarul binar
{
    int i;
    for (i=0; i<n+m; i++)
    b[i]=0;
}

void afisbin()  //afiseaza numarul binar (b[n+m])  **test purposes**
{
    int i;
    for (i = 0; i < n+m; i++)
    printf ("%-2i",b[i]);
    printf("\n");
}

void bin(int k) //generarea numerelor binare
{
    if (k>n+m-1)
    {
        changemat();  //schimba matricea
        snou = suma();  //genereaza suma noua
        if (snou > svechi) svechi = snou;
        changemat();
    }
    else
    {
        b[k] = 0; bin(k + 1);
        b[k] = 1; bin(k + 1);
    }
}
void cit()  //citirea datelor din fisier
{
    FILE *f; int i,j;
    f=fopen("flip.in","r");
    fscanf(f,"%i%i",&n,&m);
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
        fscanf(f,"%i",&a[i][j]);
    fclose(f);
}

void afismat() //afisarea matricei a[n][m] **for test purpose only**
{
    int i,j;
    for (i = 0; i < n; i++ )
    {
        if (i != 0) printf("\n");
        for (j = 0; j < m; j++)
        printf ("%-3i",a[i][j]);
    }
}

void rind(int k) //inmulteste rindul k cu -1
{
    int i;
    if (k<n)
    for (i = 0; i < m; i++)
    a[k][i] = -a[k][i];
    else printf("ERROR K PREA MARE RIND");
}

void coloana(int k) //inmulteste coloana k cu -1
{
    int i;
    if (k<m)
    for (i = 0; i < n; i++)
    a[i][k] = -a[i][k];
    else printf ("ERROR K PREA MARE COLOANA");
}

int suma()
{
    int i,j,s=0;
    for (i = 0; i < n; i++)
       for (j = 0; j < m; j++)
       s=s+a[i][j];
    return s;

}

void changemat()
{
    int i,j;
    for (i = 0; i < n+m; i++)
    {
        if (b[i] == 1 && i < n) rind(i);
        else if (b[i] == 1 && i >= m) coloana(i-n);
    }
}

void inscrierea(int s) //rezultat => flip.out
{
    FILE *f;
    f=fopen("flip.out","w");
    fprintf(f,"%i",s);
    fclose(f);
}

int main()
{
    cit();
    svechi = suma();
    bin(0);
    inscrierea(svechi);
    getch();
    return 0;
}

// A RAMAS DE FACUT PROCEDURA CARE COMPARA SUMELE