Cod sursa(job #509417)

Utilizator bleed310Blid Paul Filip bleed310 Data 11 decembrie 2010 00:36:45
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
	int n, m;

	int table[16][16];
	
	ifstream in("flip.in");
	ofstream out("flip.out");

	in >> n >> m;
	


	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
			in >> table[i][j];
	}
	in.close();

	int sumn = 0, sumf = 0; /* sum of current state and sum of flipped state */
	int sum = 0, lastsum = 0;
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < m; j++)
			lastsum += table[i][j];
	}

	while(true) /* loop is broken automatically when lastsum == sum */
	{
		for(int i = 0; i < n; i++) /* line id */
		{
			for(int j = 0; j < m; j++)
			{
				sumn += table[i][j];
				sumf += (table[i][j] * -1);
			}
			if(sumn < sumf)
			{
				for(int j = 0; j < m; j++)
					table[i][j] = (table[i][j] * -1);

				sumn = sumf;
			}
			sumn = sumf = 0; /* reset sums */
		}

		for(int j = 0; j < m; j++)
		{
			for(int i = 0; i < n; i++)
			{
				sumn += table[i][j];
				sumf += (table[i][j] * -1);
			}

			if(sumn < sumf)
			{
				for(int i = 0; i < n; i++)
					table[i][j] = (table[i][j] * -1);
			}

			sum += sumn;
			sumn = sumf = 0;
		}

		if(lastsum == sum) /* no more possible moves */
		{
			out << sum;
			out.close();
			break;
		}
		lastsum = sum;
		sum = 0;
	}
	return 0;
}