Cod sursa(job #2857330)

Utilizator alexandru.ciorneiAlexandru-Stefan Ciornei alexandru.ciornei Data 25 februarie 2022 13:31:18
Problema Jocul Flip Scor 20
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>
#include <stdlib.h>

long long int sum_lin(int lin, int m, int **mat) {
    long long int sum = 0;
    for (int j = 0; j < m; j++)
        sum += mat[lin][j];
    return sum;
}

void comut_lin(int lin, int m, int **mat) {
    for (int j = 0; j < m; j++)
        mat[lin][j] *= -1;
}

long long int sum_col(int col, int n, int **mat) {
    long long int sum = 0;
    for (int i = 0; i < n; i++)
        sum += mat[i][col];
    return sum;
}

void comut_col(int col, int n, int **mat) {
    for (int i = 0; i < n; i++)
        mat[i][col] *= -1;
}

long long int sum_mat(int **mat, int n, int m) {
    long long int sum = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            sum += mat[i][j];
    return sum;
}

int main() {
    FILE *in = fopen("flip.in", "rt");
    FILE *out = fopen("flip.out", "wt");

    // citire n, m si alocare dinamica matrice
    int n, m;
    fscanf(in, "%d%d", &n, &m);
    int **mat = (int **) calloc(n, sizeof(int *));
    for (int i = 0; i < n; i++)
        mat[i] = (int *) calloc(m, sizeof(int));

    // citire matrice
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            fscanf(in, "%d", &mat[i][j]);

    // calcul maxim sume pe linii si coloane
    // in functie de starea de comutare
    for (int i = 0; i < n; i++) {
        long long int sum = sum_lin(i, m, mat);
        comut_lin(i, m, mat);
        long long int sum_comut = sum_lin(i, m, mat);

        if (sum > sum_comut)
            comut_lin(i, m, mat);
    }
    for (int j = 0; j < m; j++) {
        long long int sum = sum_col(j, n, mat);
        comut_col(j, n, mat);
        long long int sum_comut = sum_col(j, n, mat);

        if (sum > sum_comut)
            comut_col(j, n, mat);
    }

    long long int rezultat = sum_mat(mat, n, m);
    fprintf(out, "%lld", rezultat);

    // dezalocare memorie matrice
    for (int i = 0; i < n; i++)
        free(mat[i]);
    free(mat);

    fclose(in);
    fclose(out);
    return 0;
}