Cod sursa(job #1225691)

Utilizator Florin93Balint florin Florin93 Data 3 septembrie 2014 13:34:11
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>
#include <iostream>
#include <limits.h>
#include <fstream>

using namespace std;
typedef int matrice[18][18];

int** matrix;
int sum;

int** FlipColumn(int i, int lines,int** newMatrix)
{
	for (int j = 0; j < lines; j++)
	{
		sum -= 2 * matrix[j][i];
		newMatrix[j][i] = -newMatrix[j][i];
	}

	return newMatrix;
}

int** FlipLine(int j,int columns,int** newMatrix)
{
	for (int i = 0; i < columns; i++)
	{
		sum -= 2 * matrix[j][i];
		matrix[j][i] = -matrix[j][i];		
	}

	return newMatrix;
}

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


//backtrack
int FindMax(int n,int m,int currentLine,int currentColumn,int** newMatrix)
{
	int max = sum;
	for (int i = currentLine; i < n; i++)
	{
		for (int j = currentColumn; j < m; j++)
		{
			int nextMax = FindMax(n, m, currentLine + 1, currentColumn,newMatrix);
			if (max < nextMax) max = nextMax;

			nextMax = FindMax(n, m, currentLine, currentColumn + 1,newMatrix);
			if (max < nextMax) max = nextMax;
	
			nextMax = FindMax(n, m, currentLine + 1, currentColumn, FlipLine(i, m,newMatrix));
			if (max < nextMax) max = nextMax;

			nextMax = FindMax(n, m, currentLine, currentColumn + 1, FlipColumn(j, n,newMatrix));
			if (max < nextMax) max = nextMax;
		}
	}

	return max;
}


int Flip(int n,int m)
{
	int max = INT_MIN;
	sum = sum_matrix(n, m);

	max = FindMax(n, m, 0, 0,matrix);

	return max;
}


int main()
{
	int n, m;
	
	matrix = new int*[18];
	for (int i = 0; i < 18; ++i)
		matrix[i] = new int[18];

	ifstream reader;
	reader.open("flip.in");
	reader >> n >> m;


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

	int max = Flip(n, m);

	ofstream writter;
	writter.open("flip.out");
	writter << max;
	writter.close();	

	return 0;
}