Cod sursa(job #2830502)

Utilizator ciprian.morosanuCiprian Morosanu ciprian.morosanu Data 9 ianuarie 2022 23:12:18
Problema Jocul Flip Scor 10
Compilator c-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <stdio.h>

#define MAX_ROWS 16
#define MAX_COLS 16

void updateSums(int matrix[][MAX_COLS], int *rowSum, int *colSum, unsigned rows, unsigned cols) {
    for (int row = 0; row < rows; ++row) {
        int rowSumTemp = 0;
        for (int col = 0; col < cols; ++col) {
            rowSumTemp += matrix[row][col];
        }
        rowSum[row] = rowSumTemp;
    }
    for (int col = 0; col < cols; ++col) {
        int colSumTemp = 0;
        for (int row = 0; row < rows; ++row) {
            colSumTemp += matrix[row][col];
        }
        colSum[col] = colSumTemp;
    }
}

int main() {
    char *inFileName = "flip.in";
    char *outFileName = "flip.out";
    FILE *in = fopen(inFileName, "r");
    if (in == NULL) {
        printf("Cannot open %s.\n", inFileName);
        return 1;
    }
    FILE *out = fopen(outFileName, "w");
    unsigned rows;
    unsigned cols;
    fscanf(in, "%u %u", &rows, &cols);
    int matrix[MAX_ROWS][MAX_COLS];
    int rowSum[MAX_ROWS] = {0};
    int colSum[MAX_COLS] = {0};
    int maxSum = 0;
    for (int row = 0; row < rows; ++row) {
        for (int col = 0; col < cols; ++col) {
            fscanf(in, "%d", &matrix[row][col]);
            maxSum += matrix[row][col];
        }
    }

    while (1) {
        updateSums(matrix, rowSum, colSum, rows, cols);
        int minRowSumIndex = 0;
        for (int row = 1; row < rows; ++row) {
            if (rowSum[row] < rowSum[minRowSumIndex]) {
                minRowSumIndex = row;
            }
        }
        int minColSumIndex = 0;
        for (int col = 1; col < cols; ++col) {
            if (colSum[col] < colSum[minRowSumIndex]) {
                minColSumIndex = col;
            }
        }
        if (rowSum[minRowSumIndex] < colSum[minColSumIndex] && rowSum[minRowSumIndex] < 0) {
            for (int col = 0; col < cols; ++col) {
                matrix[minRowSumIndex][col] *= -1;
            }
        } else if (colSum[minColSumIndex] < rowSum[minRowSumIndex] && colSum[minColSumIndex] < 0) {
            for (int row = 0; row < rows; ++row) {
                matrix[row][minColSumIndex] *= -1;
            }
        }
        int sum = 0;
        for (int row = 0; row < rows; ++row) {
            for (int col = 0; col < cols; ++col) {
                sum += matrix[row][col];
            }
        }
        if (sum > maxSum) {
            maxSum = sum;
        } else {
            break;
        }
    }
    fprintf(out, "%d", maxSum);
    fclose(in);
    fclose(out);
    return 0;
}