Cod sursa(job #1542739)

Utilizator TincaMateiTinca Matei TincaMatei Data 5 decembrie 2015 16:56:36
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>
#define MAX_LAT 16

int mat[ MAX_LAT ][ MAX_LAT ];

int max( int a , int b ) {
  if( a > b )
    return a;
  else
    return b;
}

//calculeaza suma tablei noi cu liniile schimbate schimband si coloanele unde este necesar
int suma( int n , int m , int subm ) {
  int l , c;
  int sCol , sTotal;
  sTotal = 0;
  for( c = 0 ; c < m ; c++ ) {
    sCol = 0;
    //calculam suma coloanei
    for( l = 0 ; l < n ; l++ )
      if( subm & ( 1 << l ) )//linia curenta este schimbata
        sCol -= mat[ l ][ c ];
      else
        sCol += mat[ l ][ c ];

    //daca suma coloanei este pozitiva o adaugam asa cum este
    if( sCol > 0 )
      sTotal += sCol;
    //daca suma coloanei este negativa o schimbam astfel incat sa fie pozitiva
    else
      sTotal -= sCol;
  }
  return sTotal;
}

int genSume( int n , int m , int subm , int poz ) {
  if( poz < n )
    return max( genSume( n , m , subm | ( 1 << poz ) , poz + 1 ) ,
                genSume( n , m , subm                , poz + 1 ) );
    //avem optiunea de a schimba linia curenta
    //sau de a o lasa cum este
  return suma( n , m , subm );
}

int main() {
  int n , m;
  int l , c , maxS;
  FILE *fin = fopen( "flip.in" , "r" );
  //citire matrice
  fscanf( fin , "%d%d" , &n, &m );
  for( l = 0 ; l < n ; l++ )
    for( c = 0 ; c < m ; c++ )
      fscanf( fin , "%d" , &mat[ l ][ c ] );
  fclose( fin );

  maxS = genSume( n , m , 0 , 0 );

  FILE *fout = fopen( "flip.out" , "w" );
  fprintf( fout , "%d" , maxS );
  fclose( fout );
  return 0;
}