#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void fprintf_sum(char* file_name, int final_sum) {
FILE* f = fopen(file_name, "w");
if (!f) {
exit(1);
}
fprintf(f, "%d", final_sum);
fclose(f);
}
void get_input(char* file_name, int*** matrix_ptr, int* N, int* M) {
FILE* f = fopen(file_name, "r");
if (!f) {
exit(1);
}
fscanf(f, "%d %d", N, M);
int** matrix = (int**)malloc(*N * sizeof(int*));
for (int i = 0; i < *N; i++) {
matrix[i] = (int*)malloc(*M * sizeof(int));
}
for (int i = 0; i < *N; i++) {
for (int j = 0; j < *M; j++) {
fscanf(f, "%d", &matrix[i][j]);
}
}
fclose(f);
*matrix_ptr = matrix;
}
int add_line(int **matrix, int line, int M) {
int s = 0;
for (int i = 0; i < M; i++) {
s += (-1) * matrix[line][i];
}
return s;
}
int add_column(int **matrix, int column, int N) {
int s = 0;
for (int i = 0; i < N; i++) {
s += (-1) * matrix[i][column];
}
return s;
}
int flip(int **matrix, int N, int M, int sw_line, int sw_column) {
int sum = 0;
// sw line
for (int i = 0; i < M; i++) {
matrix[sw_line][i] *= -1;
}
// sw col
for (int i = 0; i < N; i++) {
matrix[i][sw_column] *= -1;
}
// add
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
sum += matrix[i][j];
}
}
return sum;
}
void flip_helper(int **matrix, int N, int M, int *sw_line, int *sw_column) {
int s_line_sum = add_line(matrix, 0, M);
int s_column_sum = add_column(matrix, 0, N);
for (int i = 1; i < N; i++) {
int new_line_sum = add_line(matrix, i, M);
if (new_line_sum > s_line_sum) {
s_line_sum = new_line_sum;
*sw_line = i;
}
}
for (int i = 1; i < M; i++) {
int new_column_sum = add_column(matrix, i, N);
if (new_column_sum > s_column_sum) {
s_column_sum = new_column_sum;
*sw_column = i;
}
}
}
int main() {
int N, M, sw_line = 0, sw_column = 0, final_sum = 0;
int** matrix;
get_input("flip.in", &matrix, &N, &M);
flip_helper(matrix, N, M, &sw_line, &sw_column);
final_sum = flip(matrix, N, M, sw_line, sw_column);
fprintf_sum("flip.out", final_sum);
// free
for (int i = 0; i < N; i++)
free(matrix[i]);
free(matrix);
return 0;
}