Cod sursa(job #3136660)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 7 iunie 2023 15:23:36
Problema Jocul Flip Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("flip.in");
ofstream g("flip.out");

int n, m, A[20][20], sol[20], fr[20], maxi = LONG_LONG_MIN, v[20], B[20][20];

void verif1(int k)
{
    int sumi = 0;

    for(int i = 1; i <= k; i ++)
        for(int j = 1; j <= m; j ++)
            B[sol[i]][j] *= (-1);

    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            sumi += B[i][j];
            B[i][j] = A[i][j];
        }

    if(sumi > maxi)
    {
        for(int i = 1; i <= k; i ++)v[i] = sol[i];
        v[0] = k; maxi = sumi;
    }
}

void comb1(int K)
{
    if(K <= n)
    {
        for(int i = 1; i <= n; i ++)
            if(!fr[i]){
                fr[i] = 1;
                sol[K] = i;
                verif1(K);
                comb1(K + 1);
                fr[i] = 0;
            }
    }
}

void verif2(int k)
{
    int sumi = 0;

    for(int i = 1; i <= k; i ++)
        for(int j = 1; j <= n; j ++)
            B[j][sol[i]] *= (-1);

    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            sumi += B[i][j];
            B[i][j] = A[i][j];
        }

    if(sumi > maxi)
    {
        for(int i = 1; i <= k; i ++)v[i] = sol[i];
        v[0] = k; maxi = sumi;
    }
}

void comb2(int K)
{
    if(K <= m)
    {
        for(int i = 1; i <= m; i ++)
            if(!fr[i]){
                fr[i] = 1;
                sol[K] = i;
                verif2(K);
                comb1(K + 1);
                fr[i] = 0;
            }
    }
}

int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
        {
            f >> A[i][j];
            B[i][j] = A[i][j];
            maxi += A[i][j];
        }

    comb1(1);

    for(int i = 1; i <= v[0]; i ++)
        for(int j = 1; j <= m; j ++)
        {
            A[v[i]][j] *= (-1);
            B[v[i]][j] *= (-1);
        }

    comb2(2);

    for(int i = 1; i <= v[0]; i ++)
        for(int j = 1; j <= n; j ++)
            A[j][v[i]] *= (-1);

    int sumi = 0;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            sumi += A[i][j];

    g << sumi;
    return 0;
}