Cod sursa(job #2434169)

Utilizator RobertLISARURobert Lisaru RobertLISARU Data 30 iunie 2019 21:32:40
Problema Jocul Flip Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>

int **t;
int n, m;

int sumLine(int line) {
	int sum = 0;
	for (int j = 0; j < m; j++) {
		sum += t[line][j];
	}
	return sum;
}

int sumColumn(int column) {
	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += t[i][column];
	}
	return sum;
}

void flipLine(int line) {
	for (int j = 0; j < m; j++) {
		t[line][j] *= -1;
	}
}

void flipColumn(int column) {
	for (int i = 0; i < n; i++) {
		t[i][column] *= -1;
	}
}

int sumPivot(int iPivot, int jPivot) {
	return sumColumn(jPivot) + sumLine(iPivot) - 2 * t[iPivot][jPivot];
}

void flipPivot(int iPivot, int jPivot) {
	flipLine(iPivot);
	flipColumn(jPivot);
}

int main() {
	std::ifstream fin("flip.in");
	std::ofstream fout("flip.out");
	fin >> n;
	fin >> m;
	t = new int*[n];
	for (int i = 0; i < n; i++) {
		t[i] = new int[m];
		for (int j = 0; j < m; j++) {
			fin >> t[i][j];
		}
	}

	bool done = false;
	while (!done) {
		done = true;
		for (int i = 0; i < n; i++) {
			if (sumLine(i) < 0) {
				done = false;
				flipLine(i);
			}
		}
		for (int j = 0; j < m; j++) {
			if (sumColumn(j) < 0) {
				done = false;
				flipColumn(j);
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				if (sumPivot(i, j) < 0) {
					done = false;
					flipPivot(i, j);
				}
			}
		}
	}

	int sum = 0;
	for (int i = 0; i < n; i++) {
		sum += sumLine(i);
	}
	fout << sum;
	fout.flush();

	return 0;
}