Cod sursa(job #965871)

Utilizator BlackElfSpulber Iosif BlackElf Data 24 iunie 2013 21:12:21
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;

int board[20][20];
int aux[20][20];
int N, M;

void load ()
{
	ifstream in ("flip.in");
	
	in >> N;
	in >> M;
	
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			in >> board[i][j];
}

void copy ()
{
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			aux[i][j] = board[i][j];
}

void flipLine (int line)
{
	for (int i = 0; i < M; i++)
		aux[line][i] *= -1;
}

void flipRow (int row)
{
	for (int i = 0; i < N; i++)
		aux[i][row] *= -1;
}

void flip (int linesFlipped, int rowsFlipped)
{
	int mask = 1;
	int count = 0;
	
	while (mask < N)
	{
		if (mask & linesFlipped)
			flipLine (count);
			
		mask = mask << 1;
		count ++;
	}
	
	mask = 1;
	count = 0;
	
	while (mask < M)
	{
		if (mask & rowsFlipped)
			flipRow (count);
			
		mask = mask << 1;
		count ++;
	}
}

int sum ()
{
	int sum = 0;
	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			sum += aux[i][j];
			
	return sum;
}

int main ()
{
	int max = 0;
	
	load ();	
	
	for (int linesFlipped = 0; linesFlipped < ((1 << (N-1)) - 1); linesFlipped ++)
		for (int rowsFlipped = 0; rowsFlipped < ((1 << (M-1)) - 1); rowsFlipped ++)
		{
			copy ();
			
			flip (linesFlipped, rowsFlipped);
			
			int s;
			s = sum ();
			if (max < s)
				max = s;
		}
	
	ofstream out ("flip.out");
	out << max << endl;
	out.close();
	
	return 0;
}