Cod sursa(job #803339)

Utilizator StefanLacheStefan Lache StefanLache Data 27 octombrie 2012 13:44:40
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int N,M,max=-256000001;
FILE *g=fopen("flip.out","wt");
struct nod
{
    int info[16][16];
    nod *adr_urm;
};
nod *cap,*coada;
void PUSH(nod *&cap,nod *&coada,int m[16][16])
{
    if(!cap)
        {
            nod *g=(nod *)malloc(1*sizeof(nod));
            g->adr_urm=NULL;
            memcpy(g->info,m,sizeof(g->info));
            cap=g;
            coada=g;
            return;
        }
    nod *p=(nod *)malloc(1*sizeof(nod));
    memcpy(p->info,m,sizeof(p->info));
    coada->adr_urm=p;
    coada=p;
}
int gasit(nod *cap,nod *curent,int m[16][16])
{
    for(nod *c=cap;c!=curent;c=c->adr_urm)
        if(memcmp(c->info,m,sizeof(m)) == 0)
            return 0;
    return 1;
}
void flip_column(int coloana,int m[16][16])
{
    int i;
    for(i=0;i<N;++i)
        m[i][coloana]*=-1;
}
void flip_row(int rand,int m[16][16])
{
    int j;
    for(j=0;j<M;++j)
        m[rand][j]*=-1;
}
int suma_matrice(int m[16][16])
{
    int i,j,sum=0;
    for(i=0;i<N;++i)
        for(j=0;j<M;++j)
            sum+=m[i][j];
    return sum;
}
void arata_configuratie(int m[16][16])
{
    for(int i=0;i<N;++i)
    {
        for(int j=0;j<M;++j)
            fprintf(g,"%i ",m[i][j]);
        fprintf(g,"\n");
    }
    fprintf(g,"\n");
}
int main()
{
    int i,j,m[16][16],NR;
    FILE *f=fopen("flip.in","rt");

    fscanf(f,"%i%i",&N,&M);
    for(i=0;i<N;++i)
        for(j=0;j<M;++j)
            fscanf(f,"%i",&m[i][j]);
    fclose(f);
    PUSH(cap,coada,m);
    nod *curent=cap;
    while(curent)
    {

        fprintf(g,"Prelucrarea pt matricea:\n");arata_configuratie(curent->info);
       NR=suma_matrice(curent->info);
       NR > max ? max=NR:NR+=0;
        for(i = 0;i<N;++i)
            {
                memcpy(m,curent->info,sizeof(m));
                flip_row(i,m);
                NR=suma_matrice(m);
                if(NR > max)
                    max=NR;
                if(gasit(cap,curent,m))
                    {
                        PUSH(cap,coada,m);
                        arata_configuratie(m);
                    }
            }
        for(j=0;j<M;++j)
        {
            memcpy(m,curent->info,sizeof(m));
            flip_column(j,m);
             NR=suma_matrice(m);
                if(NR > max)
                    max=NR;
            if(gasit(cap,curent,m))
                {
                    PUSH(cap,coada,m);
                    arata_configuratie(m);
                }
        }
        curent = curent->adr_urm;
    }
    fprintf(g,"%i",max);
    return 0;
}