Cod sursa(job #200065)

Utilizator tomescu_alinTomescu Alin tomescu_alin Data 22 iulie 2008 07:27:52
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.63 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

#define MAX_ROWS 16
#define MAX_COL 16

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

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

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

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

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

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

void flipRow (long matrix[][MAX_COL], unsigned int n, unsigned int m, int row)
{
	for (int i = 0; i < m; i++) {
		matrix[row][i] *= -1;
	}
}

void flipColumn (long matrix[][MAX_COL], unsigned int n, unsigned int m, int column)
{
	for (int i = 0; i < n; i++) {
		matrix[i][column] *= -1;
	}
}

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

template<class T>
void flipAllRows (vector<T>& result, const vector<T>& values, unsigned int resultSize, unsigned int pos = 0)
{
	for (int i = 0; i < values.size(); i++)
	{
		result.at(pos) = values[i];
		
		if (pos < resultSize-1) {
			flipAllRows (result, values, resultSize, pos+1);
		}
		else {
			for (int j = 0; j < result.size(); j++)
				if (result[j] == -1)
					flipRow (Global::matrix, Global::n, Global::m, j);
			
			setMaxSum (sumMatrix (Global::matrix, Global::n, Global::m));
			
			for (int j = 0; j < result.size(); j++)
				if (result[j] == -1)
					flipRow (Global::matrix, Global::n, Global::m, j);
		}
	}
}

template<class T>
void flipAllColumns (vector<T>& result, const vector<T>& values, unsigned int resultSize, unsigned int pos = 0)
{
	for (int i = 0; i < values.size(); i++)
	{
		result.at(pos) = values[i];
		
		if (pos < resultSize-1) {
			flipAllColumns (result, values, resultSize, pos+1);
		}
		else {
			for (int j = 0; j < result.size(); j++)
				if (result[j] == -1)
					flipColumn (Global::matrix, Global::n, Global::m, j);
			
			//cout << sumMatrix (Global::matrix, Global::n, Global::m) << " ";
			// TODO: function
			flipAllRows(Global::row, values, resultSize);
			
			for (int j = 0; j < result.size(); j++)
				if (result[j] == -1)
					flipColumn (Global::matrix, Global::n, Global::m, j);
		}
	}
}


int main()
{
	using Global::matrix;
	using Global::m;
	using Global::n;
	using Global::column;
	using Global::row;
	vector<int> values;
	values.push_back(1);
	values.push_back(-1);
	
	readMatrix (matrix, n, m);
	showMatrix (matrix, n, m);	
	Global::maxSum = sumMatrix (matrix, n, m);
	row.resize(n); column.resize(m);	
	
	cout << endl;
	flipAllColumns (column, values, m);	
	
	fstream fout ("flip.out");
	fout << getMaxSum();
	fout.close();
	
	return 0;
}