Cod sursa(job #754504)

Utilizator claudia.pauletPaulet Claudia claudia.paulet Data 2 iunie 2012 12:18:26
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb

#include <stdio.h>
#include <fstream>

using namespace std;

ifstream f("flip.in");
ofstream g("flip.out");


int flip[16], flipedMat[16][16];
int mat[16][16];

int n, m;

void nextConfig()
{
	for(int i = 0; i < n; i++)
	{
		if(flip[i] == 0)
		{
			flip[i] = 1;
			break;
		}

		flip[i] = 0;
	}
}

void flipMatrix()
{
	for(int i = 0; i< n; i++)
	{
		if(flip[i] == 1)
			for(int j = 0; j<m; j++)
			{
				flipedMat[i][j] = -mat[i][j];
			}
		else
		{
			for(int j = 0; j<m; j++)
			{
				flipedMat[i][j] = mat[i][j];
			}
		}
	}
}

void flipCol(int j)
{
	for(int i = 0; i< n; i++)
		flipedMat [i][j] = -flipedMat[i][j];
}

int main()
{
	f>>n;
	f>>m;
	int i,j;

	int maxMax = 0;

	for(i = 0; i<n; i++)
	{
		for(j = 0; j<m; j++)
		{
			f>>mat[i][j];
			maxMax += mat[i][j];
		}
	}

	

	int nrConfig = (1<<n);

	for(int k = 0; k < nrConfig; k++)
	{
		nextConfig();
		flipMatrix();

		//calculate max for the config

		//flip the columns
		for(j = 0; j < m; j++)
		{
			int sumCol = 0;
				
			for(i = 0; i < n; i++)
			{
				sumCol += flipedMat[i][j];
			}
				
			if(sumCol < 0)
			{
				flipCol(j);
			}
		}

		//calculate the sum
		int max = 0;
		for(i = 0; i<n; i++)
		{
			for(j = 0; j<m; j++)
			{
				max += flipedMat[i][j];
			}
		}

		//restore max
		if(max > maxMax)
		{
			maxMax = max;
		}
	}

	g<<maxMax;


	f.close();
	g.close();

	return 0;
}