Cod sursa(job #1170732)

Utilizator StefanFaibla blah StefanFai Data 14 aprilie 2014 13:56:58
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>

using namespace std;

int suma(int a[17][17], int n, int m) {
	int s = 0, i, j;
	for ( i = 1; i <= n; i++ )
		for( j = 1; j <= m; j++ )
			s = s + a[i][j];
	return s;
}

void citire(int a[17][17], int &n, int &m) {
	ifstream f("flip.in");
	f >> n >> m;
	
	int i, j;
	for ( i = 1; i <= n; i++ )
		for( j = 1; j <= m; j++ )
			f >> a[i][j];
	f.close();
}

void afisare(int a[17][17], int n, int m) {
	int i, j;
	for ( i = 1; i <= n; i++ ) {
		for( j = 1; j <= m; j++ )
			cout << a[i][j] << ' ';
		cout << endl;
	}
}

int cond(int x[34], int k, int nr) {
	if ( nr == 0 )
		return 0;
	if ( k == 1 )
		return 1;
	int i;
	for ( i = 1; i < k; i++ )
		if ( x[i] >= nr )
			return 0;
		
	return 1;
}

void new_mattr( int a[17][17], int x[34], int n, int m, int k, int b[17][17]) {
	int i, j, c;
	for ( i = 1; i <= n; i++ )
		for( j = 1; j <= m; j++ )
			b[i][j] = a[i][j];
	for ( c = 1; c <= k; c ++ )
		if ( x[c] < 0 ) {
			j = -x[c];
			for ( i = 1; i <= n; i++)
				b[i][j] = -b[i][j];
		}
		else {
			i = x[c];
			for ( j = 1; j <= m; j++)
				b[i][j] = -b[i][j];
		}
}

void back(int a[17][17], int x[34], int n, int m, int k, int &maxim)
{ 
	for ( int i = -m; i <= n; i++ )
	  if( cond(x, k, i) ) {
		  x[k] = i;
		  if ( k <= n + m) {
			  int b[17][17];
			  new_mattr(a,x,n,m,k,b);
			  int s = suma(b,n,m);
			  if ( s > maxim )
				  maxim = s; 
			  back(a,x,n,m,k+1,maxim);
		  }
	  }
}

int main()
{
	int n, m, a[17][17], x[34], maxim;
	
	citire(a, n, m);
	maxim = suma(a, n, m);
	back(a,x,n,m,1,maxim);
	cout << maxim;
	return 0;
}