Cod sursa(job #858861)

Utilizator SPDionisSpinei Dionis SPDionis Data 19 ianuarie 2013 14:34:58
Problema Jocul Flip Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.32 kb
#include<stdio.h>

int n,m,a[16][16],am[16][16],b[32],snou,svechi=0;  //am este matricea modificata


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;
        restoremat();
    }
    else
    {
        b[k] = 0; bin(k + 1);
        b[k] = 1; bin(k + 1);
    }
}

void restoremat()
{
    int i,j;
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
        am[i][j]=a[i][j];
}

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]);
            am[i][j]=a[i][j];  //initializeaza matricea modifica am[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",am[i][j]);
    }
}

void rind(int k) //inmulteste rindul k cu -1
{
    int i;
    if (k<n)
    for (i = 0; i < m; i++)
    am[k][i] = -am[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++)
    am[i][k] = -am[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+am[i][j];
    return s;

}

void changemat()
{
    int i;
    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()
{
    int i,j;
    cit();
    bin(0);
    inscrierea(svechi);
    getch();
    return 0;
}