/* Author: Raul Vasile
* Mail: [email protected]
*/
#include <stdio.h>
// Variabila globala sucks
int max_sum;
// Calculul sumei intregii matrici
int matrix_sum(int w, int h, int matrix[16][16], int sign_lines[16]) {
int i, j, sum = 0, line_sum = 0;
for (j = 0; j < h; j++) {
line_sum = 0;
for (i = 0; i < w; i++) {
if (sign_lines[i]) {
line_sum -= matrix[i][j];
} else {
line_sum += matrix[i][j];
}
}
if (line_sum < 0) {
sum -= line_sum;
} else {
sum += line_sum;
}
}
return sum;
}
// Rezolvare problema
void solve(int w, int h, int matrix[16][16], int index, int sign_lines[16]) {
if (index > w - 1) {
int sum = matrix_sum(w, h, matrix, sign_lines);
if (sum > max_sum) {
max_sum = sum;
}
} else {
sign_lines[index] = 0;
solve(w, h, matrix, index + 1, sign_lines);
sign_lines[index] = 1;
solve(w, h, matrix, index + 1, sign_lines);
}
}
int main(int argc, char* argv[]) {
// Declarare de viariabile
int w, h, matrix[16][16], i, j, sign_lines[16];
// Declarare fisiere
FILE *input, *output;
// Deschidere fisiere
input = fopen("flip.in", "r");
output = fopen("flip.out", "w");
// Verificare fisiere
if (input == NULL || output == NULL) {
printf("Error opening files");
return 0;
} else {
fscanf(input, "%d", &w);
fscanf(input, "%d", &h);
for (i = 0; i < w; i++) {
for (j = 0; j < h; j++) {
fscanf(input, "%d", &matrix[i][j]);
}
}
solve(w, h, matrix, 0, sign_lines);
fprintf(output, "%d\n", max_sum);
}
return 0;
}