Cod sursa(job #200068)

Utilizator tomescu_alinTomescu Alin tomescu_alin Data 22 iulie 2008 08:11:36
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
// I'll be fucked if this works
#define MAX_ROWS 16
#define MAX_COL 16

namespace Global { 
	long maxSum; long matrix[MAX_ROWS][MAX_COL]; 
	unsigned int n, m; 
	vector<int> row;
	vector<int> values;
}

using Global::matrix;
using Global::maxSum;
using Global::m;
using Global::n;
using Global::values;
using Global::row;

void setMaxSum (long sum) { if (sum > maxSum) maxSum = sum; }
long getMaxSum () { return maxSum; }

template<class T>
void show (const vector<T>& v) { for (unsigned int i = 0; i < v.size(); i++) cout << v[i] << " "; cout << endl; }

void readMatrix ()
{
	ifstream fin ("flip.in");
	
	fin >> n;
	fin >> m;
	for (unsigned int i = 0; i < n; i++)
		for (unsigned int j = 0; j < m; j++)
			fin >> matrix[i][j];
	
	fin.close();
}

long sumColumn (unsigned int column)
{
	long sum = 0;
	for (unsigned int i = 0; i < n; i++) {
		sum += row[i] * matrix[i][column];
	}
	return sum;
}

void showMatrix ()
{
	for (unsigned int i = 0; i < n; i++) {
		for (unsigned int j = 0; j < m; j++) {
			cout << matrix[i][j] << " ";			
		}
		cout << endl;
	}
}

template<class T>
void flipAllRows (vector<T>& result, unsigned int resultSize, unsigned int pos = 0)
{
	for (unsigned int i = 0; i < values.size(); i++)
	{
		result.at(pos) = values[i];
		
		if (pos < resultSize-1) {
			flipAllRows (result, resultSize, pos+1);
		}
		else {
			long totalSum = 0;
			long colSum = 0;
			
			for (int i = 0; i < m; i++) {
				colSum = sumColumn (i);
				if (colSum > 0)
					totalSum += colSum;
				else
					totalSum -= colSum;
			}
			
			setMaxSum (totalSum);
			//show (result);
			//show (vector<int>(1, getMaxSum()));
			
		}
	}
}


long sumMatrix ()
{
	long sum = 0;
	for (unsigned int i = 0; i < n; i++) {
		for (unsigned int j = 0; j < m; j++) {
			sum += matrix[i][j];
		}
	}
	return sum;
}

int main()
{		
	values.push_back(1);
	values.push_back(-1);
	
	readMatrix ();
	showMatrix ();
	maxSum = sumMatrix ();
	row.resize(n);
	
	cout << endl;
	flipAllRows (row, n);
	
	ofstream fout ("flip.out");
	fout << getMaxSum();
	//cout << getMaxSum();
	fout.close();
	
	return 0;
}