Cod sursa(job #384842)

Utilizator tuddortudor ionut tuddor Data 21 ianuarie 2010 10:01:41
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <stdio.h>

FILE *fin, *fout;

#define max_n 32
#define max_m 32

int n, m, mat[max_n][max_m], tmp[max_n][max_m];

int main(void){

  // idei preluate din rez lui fluffy
  int i, j, v, s, tmp_s;
  int sum_min = -256000000;

  //deschide fisierele
  fin = fopen("flip.in", "rt");
  fout = fopen("flip.out", "wt");

  // citeste datele de intrare
  fscanf(fin, "%d%d", &n, &m);
  for (i = 0; i < n; i++)
    for (j = 0; j < m; j++)
      fscanf(fin, "%d", &mat[i][j]);

  // pt. toate variantele
  for (v = 0; v < (1 << n); v++){

    // construiesc matricea temporara cu suma minima pe coloane
    for (i = 0; i < n; i++)
      for (j = 0; j < m; j++){
        if ((1 << i) & v)
          tmp[i][j] = mat[i][j];
        else
          tmp[i][j] = - mat[i][j];
      }

      for (j = 1; j < m; j++){
        s = 0;
        for (i = 0; i < n; i++)
          s += tmp[i][j];
        if (s < 0){
          for (i = 0; i < n; i++)
            tmp[i][j] = -tmp[i][j];
        }
      }

    // calculez suma elementelor si compar
    tmp_s = 0;
    for (i = 0; i < n; i++)
      for (j = 0; j < m; j++)
        tmp_s += tmp[i][j];

    if (tmp_s > sum_min)
      sum_min = tmp_s;
  }


  // afisez rezultate
  fprintf(fout, "%d\n", sum_min);

  // inchid fisiere
  fclose(fin);
  fclose(fout);
  return 0;
}