Pagini recente » Borderou de evaluare (job #1567416) | Borderou de evaluare (job #2021041) | Cod sursa (job #2771904) | Cod sursa (job #541322) | Cod sursa (job #2771903)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <chrono>
class Board {
private:
std::vector<std::vector<int>> internal_board;
unsigned long long number_of_lines;
unsigned long long number_of_columns;
public:
explicit Board(std::vector<std::vector<int>> matrix) {
internal_board = std::move(matrix);
number_of_lines = internal_board.capacity();
number_of_columns = internal_board[0].capacity();
}
unsigned long long get_number_of_lines(){
return number_of_lines;
}
unsigned long long get_number_of_columns(){
return number_of_columns;
}
void flip_line(int number) {
for (auto &col: internal_board[number]) {
col *= -1;
}
}
void flip_column(int number) {
for (auto &row: internal_board) {
row[number] *= -1;
}
}
void print_matrix() {
std::cout << "\n<------------------->\n";
for (const auto &row: internal_board) {
for (const auto &col: row) {
std::cout << col << " ";
}
std::cout << '\n';
}
}
int get_sum() {
int sum = 0;
for (const auto &row: internal_board) {
for (const auto &col: row) {
sum += col;
}
}
return sum;
}
int sum_line(int number) {
int sum = 0;
for (const auto &col: internal_board[number]) {
sum += col;
}
return sum;
}
int sum_col(int number) {
int sum = 0;
for (const auto &row: internal_board) {
sum += row[number];
}
return sum;
}
void print_sum() {
std::cout << '\n' << get_sum() << '\n';
}
};
int flip_algo() {
std::string input_file_name("../flip.in");
std::string output_file_name("../flip.out");
std::ifstream input_file;
input_file.open(input_file_name);
if (!input_file.is_open()) {
std::cerr << "Could not open the file: '" << input_file_name << "'" << std::endl;
return EXIT_FAILURE;
}
std::ofstream out;
out.open(output_file_name);
if (!out.is_open()) {
std::cerr << "Could not open the file: '" << output_file_name << "'" << std::endl;
return EXIT_FAILURE;
}
int M, N;
input_file >> M >> N;
auto matrix = std::vector<std::vector<int>>(M);
for (auto &row: matrix) {
row = std::vector<int>(N);
for (auto &col: row) {
input_file >> col;
}
}
input_file.close();
auto game = new Board(matrix);
int limit = 1 << game->get_number_of_lines();
int max_sum = game->get_sum();
std::vector<int> flipped_columns;
int flipped_lines[16] = {0};
auto tmp_game = game;
for (int i = 0; i < limit; ++i) {
for (int j = 0; 1 << j <= i; ++j) {
if (i & (1 << j)) {
if (flipped_lines[j] == 0) {
tmp_game->flip_line(j);
flipped_lines[j] = 1;
}
} else {
if (flipped_lines[j] == 1) {
tmp_game->flip_line(j);
flipped_lines[j] = 0;
}
}
}
for (int k = 0; k < tmp_game->get_number_of_columns(); ++k) {
if (tmp_game->sum_col(k) < 0) {
tmp_game->flip_column(k);
flipped_columns.push_back(k);
}
}
int new_sum = tmp_game->get_sum();
if (new_sum > max_sum) {
max_sum = new_sum;
}
while (!flipped_columns.empty()) {
tmp_game->flip_column(flipped_columns.back());
flipped_columns.pop_back();
}
}
out << max_sum;
out.close();
return 0;
}
int main() {
using namespace std;
using namespace std::chrono;
auto start = high_resolution_clock::now();
flip_algo();
auto stop = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(stop - start);
cout << duration.count() << endl;
}