Cod sursa(job #2242141)

Utilizator DordeDorde Matei Dorde Data 17 septembrie 2018 21:15:18
Problema Jocul Flip Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f ("flip.in");
ofstream g ("flip.out");
int v [17][17] , v2 [17][17] , n , m;
inline void fliprow (int row){
    int i;
    for(i = 1 ; i <= m ; ++ i)
        v2 [row][i] = 0 - v2 [row][i];
}
inline void flipcol (int column){
    int i;
    for(i = 1 ; i <= n ; ++ i)
        v2 [i][column] = 0 - v2 [i][column];
}
inline int sum (){
    int S = 0;
    for(int i = 1 ; i <= n ; ++ i)
        for(int j = 1 ; j <= m ; ++ j)
            S += v2 [i][j];
    return S;
}
inline void bestop (){
    int i , j;
    for(i = 1 ; i <= m ; ++ i){
        int s1 = 0;
        for(j = 1 ; j <= n ; ++ j)
            s1 += v2 [j][i];
        int s2 = 0;
        flipcol (i);
        for(j = 1 ; j <= n ; ++ j)
            s2 += v2 [j][i];
        if (s1 > s2)
            flipcol (i);
    }
}
int main()
{
    int i , j , best = 0;
    f >> n >> m;
    for(i = 1 ; i <= n ; ++ i)
        for(j = 1 ; j <= m ; ++ j)
            f >> v [i][j];
    for(i = 1 ; i < (1 << (n + 1)) ; ++ i){
        for(int o = 1 ; o <= n ; ++ o)
            copy (v [o] + 1 , v [o] + m + 1 , v2 [o] + 1);
        for(j = 0; (1 << j) <= i ; j ++)
            if ((1 << j) & i)
                 fliprow (j + 1);
        bestop ();
        best = max (sum () , best);
    }
    g << best;
    return 0;
}