Cod sursa(job #2110686)

Utilizator BogdanVMVilculescu Mihai Bogdan BogdanVM Data 21 ianuarie 2018 10:28:02
Problema Jocul Flip Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <stdio.h>
#include <stdlib.h>

int** read_data(char* file_name, int* lines, int* columns)
{
    FILE* in_txt = fopen(file_name, "r");

    fscanf(in_txt, "%d%d", lines, columns);
    int** matrix = (int**) malloc( (*lines) * sizeof(int*) );

    int i, j;
    for(i = 0; i < *lines; i++)
    {
        matrix[i] = (int*) malloc( (*columns) * sizeof(int) );
        for(j = 0; j < *columns; j++)
            fscanf(in_txt, "%d", &matrix[i][j]);
    }

    fclose(in_txt);
    return matrix;
}

void print_matrix(int** matrix, int lines, int columns)
{
    int i, j;
    for(i = 0; i < lines; i++)
    {
        for(j = 0; j < columns; j++)
            printf("%d ", matrix[i][j]);

        printf("\n");
    }
}

void flip_row(int** matrix, int columns, int row, int col_index)
{
    if (col_index == columns)
        return;

    matrix[row][col_index] = (-matrix[row][col_index]);
    flip_row(matrix, columns, row, col_index + 1);
}

void flip_column(int** matrix, int lines, int column, int row_index)
{
    if (row_index == lines)
        return;

    matrix[row_index][column] = (-matrix[row_index][column]);
    flip_column(matrix, lines, column, row_index + 1);
}

int sum_row(int** matrix, int columns, int row, int col_index)
{
    if (col_index == columns)
        return 0;

    return matrix[row][col_index] + sum_row(matrix, columns, row, col_index + 1);
}

int sum_column(int** matrix, int lines, int column, int row_index)
{
    if (row_index == lines)
        return 0;

    return matrix[row_index][column] + sum_column(matrix, lines, column, row_index + 1);
}

int sum_matrix(int** matrix, int lines, int columns, int row_index, int col_index)
{
    if (row_index == lines)
        return 0;

    if (col_index == columns)
        return sum_matrix(matrix, lines, columns, row_index + 1, 0);

    return matrix[row_index][col_index] + sum_matrix(matrix, lines, columns, row_index, col_index + 1);
}

int main()
{
    int n, m, sum = 0;
    int** matrix = read_data("flip.in", &n, &m);

    int i;
    for(i = 0; i < n; i++)
        if (sum_row(matrix, m, i, 0) < 0)
            flip_row(matrix, m, i, 0);

    for(i = 0; i < m; i++)
        if (sum_column(matrix, n, i, 0) < 0)
            flip_column(matrix, n, i, 0);

    sum = sum_matrix(matrix, n, m, 0, 0);

    FILE* out_txt = fopen("flip.out", "w");
    fprintf(out_txt, "%d\n", sum);

    fclose(out_txt);
    return 0;
}