Cod sursa(job #1329903)

Utilizator charmpitzAndrei Pit charmpitz Data 29 ianuarie 2015 23:31:13
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.17 kb

/*
Enunt:
Jocul Flip
Gigel a descoperit un nou joc pe care l-a numit "Flip". Acesta se joaca pe o tabla dreptunghiulara de dimensiuni N*M care contine numere intregi. Fiecare linie si fiecare coloana are un comutator care schimba starea tuturor elementelor de pe acea linie sau coloana, inmultindu-le cu -1. Scopul jocului este ca pentru o configuratie data a tablei de joc sa se actioneze asupra liniilor si coloanelor astfel incat sa se obtina o tabla cu suma elementelor cat mai mare.

Cerinta
Dandu-se o configuratie pentru tabla "Flip", realizati un program care sa determine suma maxima pe care Gigel o poate obtine.

Date de Intrare
Prima linie a fisierului flip.in contine doua numere intregi N si M, separate prin cate un spatiu, care reprezinta dimensiunea tablei. Urmatoarele N linii contin cate M numere intregi seperate prin cate un spatiu care descriu configuratia tablei de joc.

Date de Iesire
Prima linie a fisierului flip.out contine un numar care va reprezenta suma maxima pe care Gigel o poate obtine comutand liniile si coloanele tablei de joc.

Restrictii si precizari
1 ≤ N, M ≤ 16
Tabla de joc contine numere intregi din intervalul [-1.000.000,1.000.000]

Exemplu

flip.in	
5 3
4 -2 2
3 -1 5
2 0 -3
4 1 -3
5 -3 2

flip.out
28
*/

/*
Rezolvare:
Luam toate configuratiile de subumltumi pe coloane si facem flip pe liniile cu suma negativa.
*/


#include <stdio.h>

FILE *in, *out;
int m, n, x[20][20], smax;

int main ()
{
	int i, j, l, b[20], s, sl, aux, p;

	in = fopen("flip.in", "r");
	out = fopen("flip.out", "w");

	fscanf(in, "%d", &m);
	fscanf(in, "%d", &n);

	for (i=1; i<=m; i++)
	{
		for (j=1; j<=n; j++)
		{
			fscanf(in, "%d", &x[i][j]);
		}
	}

	// calculam 2^n
	p = 1;
	for (i=1; i<=n; i++)
	{
		p = p * 2;	
	}

	for (l=0; l<p; l++)
	{
		aux = l;
		
		// aflam submultimea transoformand l in baza 2
		for (j=1; j<=n; j++)
		{
			b[j] = aux % 2;
			aux = aux / 2;	
		}

		s = 0;

		for (i=1; i<=m; i++)
		{
			sl = 0;
			for (j=1; j<=n; j++)
			{
				if (b[j])
					sl = sl - x[i][j];
				else
					sl = sl + x[i][j];
			}

			if (sl < 0)
				sl = -sl;

			s = s + sl;
		}

		if (s > smax)
			smax = s;
	}

	fprintf(out, "%d\n", smax);
	
	fclose(out);
	fclose(in);

	return 0;
}