Cod sursa(job #320744)

Utilizator alin_cpuBanu Alexandru Alin alin_cpu Data 5 iunie 2009 18:11:49
Problema Jocul Flip Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.14 kb
/*
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]
*/


#include <stdio.h>

int main(void) {
	FILE *in, *out;
	unsigned int m,n,i,j,sum;
	int F[16][16], sn, sp;

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

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

	printf("\n");
	for(i=0; i<m; i++) {
		for(j=0; j<n; j++) {
			fscanf(in, "%i", &F[i][j]);
			printf("%4i", F[i][j]);
		}
		printf("\n");
	}

	for(i=0; i<m; i++) {
		sn=0; sp=0;
		for(j=0; j<n; j++)
			if (F[i][j] > 0)
				sp = sp + F[i][j];
			else
				sn = sn + F[i][j];

		if ( abs(sn) > sp )
			for(j=0; j<n; j++)
				F[i][j] = -F[i][j];
	}

	for(j=0; j<n; j++) {
		sn=0; sp=0;
		for(i=0; i<m; i++)
			if (F[i][j] > 0)
				sp = sp + F[i][j];
			else
				sn = sn + F[i][j];

		if ( abs(sn) > sp )
			for(i=0; i<m; i++)
				F[i][j] = -F[i][j];
	}

	sum = 0;
	for(i=0; i<m; i++)
		for(j=0; j<n; j++)
			sum += F[i][j];

	printf("\n sum: %i", sum);

	fprintf(out,"%i", sum);

	fclose(in); fclose(out);

	return 0;
}