Cod sursa(job #2953464)

Utilizator naivejulianIulian Macovei naivejulian Data 11 decembrie 2022 15:16:13
Problema Jocul Flip Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <iostream>
#include <fstream>
#include <bitset>

using namespace std;

ifstream in("flip.in");
ofstream out("flip.out");
int colectie[16][16];
string bit_array;
int x = 0, y = 0;

int suma_rand_poz(int n) {
	int sum = 0;
	for (int j = 0; j < x; j++) {
		if (colectie[j][n]>0) {
			sum += colectie[j][n];
		}
	}
	return sum;
}
int suma_rand_neg(int n) {
	int sum = 0;
	for (int j = 0; j < x; j++) {
		if (colectie[j][n] < 0) {
			sum += colectie[j][n];
		}
	}
	return sum;
}
int suma_coloana_poz(int n) {
	int sum = 0;
	for (int i = 0; i < y; i++) {
		if (colectie[n][i] > 0) {
			sum += colectie[n][i];
		}
	}
	return sum;
}
int suma_coloana_neg(int n) {
	int sum = 0;
	for (int i = 0; i < y; i++) {
		if (colectie[n][i] < 0) {
			sum += colectie[n][i];
		}
	}
	return sum;
}

void invert_rand(int n) {
	for (int j = 0; j < x; j++) {
		colectie[j][n] = colectie[j][n]*(-1);
	}
}

void invert_coloana(int n) {
	for (int i = 0; i < y; i++) {
		colectie[n][i] *= (-1);
	}
}

int calc_tot_sum() {
	int tot_sum = 0;
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			tot_sum = tot_sum + colectie[j][i];
		}
	}
	return tot_sum;
}

void print_colectie() {
	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			std::cout << colectie[j][i] << " ";
		}
		std::cout << endl;
	}
}

int main()
{
	int tot_sum_max = 0, mau = 0;
	int num = 0;
	int nomber = -1;
	in >> y;
	in >> x;

	for (int i = 0; i < y; i++) {
		for (int j = 0; j < x; j++) {
			in >> num;
			colectie[j][i] = num;
		}
	}

	//print_colectie();

	bit_array = bitset<32>(nomber).to_string();
	//std::cout << bit_array << endl;

	string final_str = bitset<32>(0).to_string();
	for (int i = 32-(x + y); i < 32; i++) {
		final_str[i] = '1';
	}

	//std::cout << final_str << endl;

	while (bitset<32>(nomber).to_string() != final_str) {
		short rand = y-1, col = 0;
		nomber++;
		bit_array = bitset<32>(nomber).to_string();
		for (int i = 31; i > (31 - (x + y)); i--) {
			//std::cout << i << ": ";
			if (i > (31 - y)) {
				if (bit_array[i] == '1') {
					invert_rand(rand);
					mau = calc_tot_sum();
					if (mau > tot_sum_max) {
						tot_sum_max = mau;
					}
					invert_rand(rand);
					//std::cout << "rand: " << rand;
				}
				rand -= 1;
			}
			if (i <= (31 - y)) {
				if (bit_array[i] == '1') {
					invert_coloana(col);
					//print_colectie();
					mau = calc_tot_sum();
					if (mau > tot_sum_max) {
						tot_sum_max = mau;
					}
					invert_coloana(col);
					//std::cout << " col: " << col;
				}
				col += 1;
			}
			//std::cout << endl;
		}
		//std::cout << nomber << ": " << bitset<32>(nomber) << endl;
	}

	//std::cout << tot_sum_max;
	out << tot_sum_max;

	in.close();
	out.close();
}