Cod sursa(job #1482068)

Utilizator raulvasileRaul Vasile raulvasile Data 5 septembrie 2015 22:19:41
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.79 kb
/* Author: Raul Vasile
 * Mail: [email protected]
 */

#include <stdio.h>

// Variabila globala sucks
int max_sum;

// Calculul sumei intregii matrici
int matrix_sum(int w, int h, int matrix[16][16], int sign_lines[16]) {
    int i, j, sum = 0, line_sum = 0;

    for (j = 0; j < h; j++) {
        line_sum = 0;

        for (i = 0; i < w; i++) {
            if (sign_lines[i]) {
                line_sum -= matrix[i][j];
            } else {
                line_sum += matrix[i][j];
            }
        }

        if (line_sum < 0) {
            sum -= line_sum;
        } else {
            sum += line_sum;
        }
    }

    return sum;
}

// Rezolvare problema
void solve(int w, int h, int matrix[16][16], int index, int sign_lines[16]) {
    if (index > w - 1) {
        int sum = matrix_sum(w, h, matrix, sign_lines);

        if (sum > max_sum) {
            max_sum = sum;
        }
    } else {
        sign_lines[index] = 0;
        solve(w, h, matrix, index + 1, sign_lines);
        sign_lines[index] = 1;
        solve(w, h, matrix, index + 1, sign_lines);
    }
}

int main(int argc, char* argv[]) {
    // Declarare de viariabile
    int w, h, matrix[16][16], i, j, sign_lines[16];

    // Declarare fisiere
    FILE *input, *output;

    // Deschidere fisiere
    input = fopen("flip.in", "r");
    output = fopen("flip.out", "w");

    // Verificare fisiere
    if (input == NULL || output == NULL) {
        printf("Error opening files");
        
        return 0;
    } else {
        fscanf(input, "%d", &w);
        fscanf(input, "%d", &h);

        for (i = 0; i < w; i++) {
            for (j = 0; j < h; j++) {
                fscanf(input, "%d", &matrix[i][j]);
            }
        }

        solve(w, h, matrix, 0, sign_lines);

        fprintf(output, "%d\n", max_sum);
    }

    return 0;
}