Cod sursa(job #468231)

Utilizator IrnukIrina Grosu Irnuk Data 2 iulie 2010 20:05:08
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>

#define NMAX 20

using namespace std;

int n,m;
long fil[NMAX][NMAX],s,maxim,minim=LONG_MIN;

void schimba_coloana(int j)
{
	int i;
	for(i=0;i<n;i++)
	{
		fil[i][j]=-fil[i][j];
		fil[i][m]=fil[i][m]+2*fil[i][j];
	}
	fil[n][j]=-fil[n][j];
	s=s+2*fil[n][j];
	if(s>maxim)
		maxim=s;
}

void schimba_linia(int i)
{
	int j;
	for(j=0;j<m;j++)
	{
		fil[i][j]=-fil[i][j];
		fil[n][j]=fil[n][j]+2*fil[i][j];
	}
	fil[i][m]=-fil[i][m];
	s=s+2*fil[i][m];
	if(s>maxim)
		maxim=s;
}

int main()
{
	int i,j,ce,indice;
	fstream fin,fout;

	fin.open("flip.in",ios::in);
	fout.open("flip.out",ios::out);

	fin>>n>>m;
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			fin>>fil[i][j];
			fil[n][j]+=fil[i][j];
			fil[i][m]+=fil[i][j];
			s+=fil[i][j];
		}
	}

	while(minim<0)
	{
		minim=LONG_MAX;
		for(j=0;j<m;j++)
		{
			if(fil[n][j]<minim)
			{
				minim=fil[n][j];
				ce=1;
				indice=j;
			}
		}

		for(i=0;i<n;i++)
		{
			if(fil[i][m]<minim)
			{
				minim=fil[i][m];
				ce=0;
				indice=i;
			}
		}
		if(minim<0)
		if(ce==0)
			schimba_linia(indice);
		else
			schimba_coloana(indice);
	}

	fout<<maxim<<'\n';
	fin.close();
	fout.close();
	return 0;
}