Pagini recente » Cod sursa (job #535098) | Cod sursa (job #89339) | Cod sursa (job #155506) | Cod sursa (job #1063928) | Cod sursa (job #1225691)
#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;
}