Cod sursa(job #1504681)

Utilizator wondeRspringAlexandru wondeRspring Data 18 octombrie 2015 01:24:34
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <fstream>
using namespace std;

ifstream fi("flip.in");
ofstream fo("flip.out");

int matrix[100][100], M, N, maxm = 0;

int sum_op(int av[100][100], int r_len, int c_len, int idx, bool rc);
void row(int av[100][100], int r_len, int c_len, int r_idx, int maxm);
void col(int av[100][100], int r_len, int c_len, int c_idx, int maxm);

void read(int av[100][100], int &r_len, int &c_len)
{
//	printf("Linii si coloane: ");
	fi >> r_len >> c_len;
	for (int i = 0; i < r_len; i++) {
		for (int j = 0; j < c_len; j++) {
			fi >> av[i][j];
		}
	}
}

int main()
{
	read(matrix, M, N);
	row(matrix, M, N, 0, maxm);
	for (int i = 0; i < M; i++) {
		for (int j = 0; j < N; j++) {
			maxm += matrix[i][j];
		}
	}
	fo << maxm;
	fi.close();
	fo.close();
	return 0;
}

int sum_op(int av[100][100], int r_len, int c_len, int idx, bool rc)
{
	int i, s = 0;
	/*
	Booleanul rc este un indice de control care retine indexul randului/coloanei
	pe care trebuie executata procedura. Pentru valoarea 0 se va face suma de pe
	un anumit rand, iar pentru valoarea 1 se va face suma de pe o coloana.
	*/
	if (!rc) {
		for (i = 0; i < c_len; i++) {
			s += av[idx][i];
		}
	}
	else {
		for (i = 0; i < r_len; i++) {
			s += av[i][idx];
		}
	}
	return s;
}

void row(int av[100][100], int r_len, int c_len, int r_idx, int maxm)
{
	int static lst_idx = 0;
	if (lst_idx == r_idx || r_idx == r_len) {
		if (r_idx != r_len)
		{
			row(av, r_len, c_len, r_idx + 1, maxm);
		}
	}
	else {
		int i;
		if (sum_op(av, r_len, c_len, r_idx, 0) < 0) {
			for (i = 0; i < c_len; i++) {
				av[r_idx][i] *= (-1);
			}
			lst_idx = r_idx;
			col(av, r_len, c_len, 0, maxm);
		}
		else {
			row(av, r_len, c_len, r_idx + 1, maxm);
		}
	}
}

void col(int av[100][100], int r_len, int c_len, int c_idx, int maxm)
{
	int static lst_idx;
	if (lst_idx == c_idx || c_idx == c_len) {
		if (c_idx != c_len)
		{
			col(av, r_len, c_len, c_idx + 1, maxm);
		}
	}
	else {
		int i;
		if (sum_op(av, r_len, c_len, c_idx, 1) < 0) {
			for (i = 0; i < r_len; i++) {
				av[i][c_idx] *= (-1);
				lst_idx = c_idx;
				row(av, r_len, c_len, 0, maxm);
			}
		}
		else {
			col(av, r_len, c_len, c_idx + 1, maxm);
		}
	}
}