Cod sursa(job #1170784)

Utilizator StefanFaibla blah StefanFai Data 14 aprilie 2014 15:47:17
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <fstream>
#include<iostream>

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;
	}
	cout<<endl<<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 reverse(int a[17][17], int n, int m, int nr, int &s) {
	int i, j;
	if ( nr < 0 ) {
		j = -nr;
		for ( i = 1; i <= n; i++ ) {
			s = s - 2*a[i][j];
			a[i][j] = -a[i][j];
		}
		
	}
	else if(nr>0){
		i = nr;
		for ( j = 1; j <= m; j++ ) {
			s = s - 2*a[i][j];
			a[i][j] = -a[i][j];
		}
	}
}

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

int main()
{
	int n, m, a[17][17], x[34], maxim, s;
	
	citire(a, n, m);
	maxim = suma(a, n, m);
	s=maxim;
	back(a,x,n,m,1,maxim,s);
	
	ofstream g("flip.out");
	
	g<<maxim;
	
	g.close();
	
	return 0;
}