Cod sursa(job #494491)

Utilizator zooppAccount deletion pending zoopp Data 21 octombrie 2010 19:58:35
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <cstdio>
#include <list>

using namespace std;

int sum(int (*matr)[16], int &row, int &line);
void back_row(int (*matr)[16], int &row, int &line, int index, list<int> &solution);
void back_line(int (*matr)[16], int &row, int &line, int index, list<int> &solution);
void flip(int (*matr)[16], int &row, int &line, int index, char c);

int main()
{
    int matr[16][16];
    int row;
    int line;
    list<int> solution;
    int min = 0;
    
    FILE *input = fopen("flip.in", "r");
    FILE *output = fopen("flip.out", "w");
    
    if (input != NULL) {
        fscanf(input, "%d %d", &row, &line);
        
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < line; j++) {
                fscanf(input, "%d", &matr[i][j]);
            }
        }
    }
    
    back_row(matr, row, line, 0, solution);
    
    for (list<int>::iterator it = solution.begin(); it != solution.end(); it++) {
        if (*it > min) {
            min = *it;
        }
    }
    
    fprintf(output, "%d", min);
    return 0;
}

int sum(int (*matr)[16], int &row, int &line)
{
    int tempSum = 0;
    
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < line; j++) {
            tempSum += matr[i][j];
        }
    }
    return tempSum;
}

void back_row(int (*matr)[16], int &row, int &line, int index, list<int> &solution)
{
    if (index == row) {
        back_line(matr, row, line, 0, solution);
        return;
    }
    
    back_row(matr, row, line, index + 1, solution);
    flip(matr, row, line, index, 'r');
    back_row(matr, row, line, index + 1, solution);
}

void back_line(int (*matr)[16], int &row, int &line, int index, list<int> &solution)
{
    if (index == line) {
        solution.push_back(sum(matr, row, line));
        return;
    }
    
    back_line(matr, row, line, index + 1, solution);
    flip(matr, row, line, index, 'l');
    back_line(matr, row, line, index + 1, solution);
}

void flip(int (*matr)[16], int &row, int &line, int index, char c)
{
    switch (c) {
        case 'r':
            for (int i = 0; i < row; i++) {
                matr[i][index] *= -1;
            }
            break;
        case 'l':
            for (int i = 0; i < line; i++) {
                matr[index][i] *= -1;
            }
            break;
    }
}