Cod sursa(job #1150431)

Utilizator accxelAlex Carp accxel Data 22 martie 2014 23:32:48
Problema Jocul Flip Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#include <stdlib.h>

int M[16][16], aux[32];
int n, m, smax;

void comuta(char mod, int id);

void citesteMat(FILE *f)
{
	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++)
			fscanf(f, "%d", &M[i][j]);
	return;
}

#if 0
int sumCol(int idCol)
{
	int s=0;
	for(int i=0; i<n; i++)
		s+=M[i][idCol];
	return s;
}

int sumLin(int idLin)
{
	int s=0;
	for(int i=0; i<m; i++)
		s+=M[idLin][i];
	return s;
}
#endif

int sumMat()
{
	int s=0,i,j;
	for(i=0; i<n; i++)
		if(aux[i]) comuta('l', i);
    for(;i<n+m;i++)
        if(aux[i]) comuta('c', i-n);
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
            s+=M[i][j];
	return s;
}

void comuta(char mod, int id)
{
	switch(mod)
	{
		case 'l': for(int i=0; i<m; i++) M[id][i]*=(-1); break;
		case 'c': for(int i=0; i<n; i++) M[i][id]*=(-1); break;
		default: break;
	}
    return;
}

void back(int k)
{
    if(k==n+m)
        {
            int s=sumMat();
            if(s>smax) smax=s;
        }
    else
    {
        aux[k]=1;
        back(k+1);
        aux[k]=0;
        back(k+1);
    }
    return;
}

int main()
{
	FILE *fi, *fo;
	fi=fopen("flip.in", "r");
	fo=fopen("flip.out", "w");
	fscanf(fi, "%d %d", &n, &m);
	citesteMat(fi);
    back(0);
	fprintf(fo, "%d", smax);
    fclose(fi);
    fclose(fo);
	return 0;
}