Cod sursa(job #1380333)

Utilizator andreisecAndrei Tudor andreisec Data 7 martie 2015 15:32:05
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#include<stdio.h>
//#include<conio.h>
#include<stdlib.h>


long long suma(int *v, int N, int M){
    int i,j;
    long long sum;
    sum = 0;
    for(i=0;i<N;i++)
        for(j=0;j<M;j++){
            sum = sum + v[i*M+j];
            //printf("%d ", v[i*M+j]);
        }
    return sum;
}

int flip(int *v, int r, int c, int N, int M){
     v[r*M+c] =  v[r*M+c]*-1;
     return 0;
}

int flip_row(int *v, int r, int N, int M){
    int i;
    for(i=0;i<M;i++)
        flip(v,r,i,N,M);
    return 0;
}

int flip_col(int *v, int c, int N, int M){
    int i;
    for(i=0;i<N;i++)
        flip(v,i,c,N,M);
    return 0;
}

int main(){
   
    int i,j,M,N;
    FILE *in,*out;
    in = fopen("flip.in","r");
    out = fopen("flip.out","w+");
    if(!fscanf(in, "%d %d\n", &N, &M)) return 1;
    int board[N][M];
    long long max = 0;

    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            if(!fscanf(in, "%d ", &board[i][j])) return 1;
            max+=board[i][j];
//            printf("%d ", board[i][j]);
        }
    }
    int temp[N][M];
    int *pboard = &temp[0][0];
    int all = 1, row, col, count;
    long long sum;
    all<<=(M+N);

//    printf("%d\n", suma(pboard,N,M));

//    row*M+col

    for (i=0;i<all;i++){
        count = i;
        for(row=0;row<N;row++)
            for(col=0;col<M;col++)
                temp[row][col] = board[row][col];
        sum = 0;
        for (row=0;row<N;row++){
            if (count%2 ==  1)
               flip_row(pboard, row, N, M);
            count/=2;
        }
        for (col = 0;col<M;col++){
            if (count%2 ==  1)
               flip_col(pboard, col, N, M);
            count/=2;
        }            
        sum = suma(pboard, N, M);
        if (sum>max)
           max = sum;
 
    }
      
    fprintf(out,"%lld", max);       
    fclose(in);
    fclose(out);

 return 0;
}