Cod sursa(job #1380324)

Utilizator andreisecAndrei Tudor andreisec Data 7 martie 2015 15:11:16
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 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+");
    fscanf(in, "%d %d\n", &N, &M);
    int board[N][M];
//    int fakeboard[N][M];
//    int *pboard = (int*) malloc(M*N);
//    if(!pboard) return 1;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            fscanf(in, "%d ", &board[i][j]);
//            printf("%d ", board[i][j]);
        }
        fscanf(in,"\n");
    }
    int *pboard = &board[0][0];
    int all = 1, row, col, temp;
    all<<=(M+N);
//    printf("%d\n", suma(pboard,N,M));

//    row*M+col
    int sums[all];
    for (i=0;i<all;i++){
        sums[i]=0;
        temp = i;
        for (row=0;row<N;row++){
            if (temp%2 ==  1)
               flip_row(pboard, row, N, M);
            temp/=2;
        }
        for (col = 0;col<M;col++){
            if (temp%2 ==  1)
               flip_col(pboard, col, N, M);
            temp/=2;
        }            
        sums[i] = suma(pboard, N, M);
        temp = i;
        for (row=0;row<N;row++){
            if (temp%2 ==  1)
               flip_row(pboard, row, N, M);
            temp/=2;
        }
        for (col = 0;col<M;col++){
            if (temp%2 ==  1)
               flip_col(pboard, col, N, M);
            temp/=2;
        } 
       // getrc(i);
    }
      
//    flip_col(pboard,1,N,M);

//    for(i=0;i<N;i++){
//        for(j=0;j<M;j++){
//             printf("%d ", board[i][j]);
//        }
//        printf("\n");
//    }
    long long max = 0;
    for (i=0;i<all;i++)
        if (sums[i]>max)
           max = sums[i];
    fprintf(out,"%lld", max);       
    fclose(in);
    fclose(out);
//    free(pboard);
   // getch();
 return 0;
}