Cod sursa(job #22229)

Utilizator AdixSuciu Adrian Adix Data 25 februarie 2007 22:55:12
Problema Jocul Flip Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
//Flip
#include <stdio.h>
int m,n;
long int a[500][18];
void flip_lin(int i){
 for(int j=1;j<=m;++j)
 a[i][j]=-(a[i][j]);}
void flip_col(int j){
 for (int i=1;i<=n;i++)
 a[i][j]=-(a[i][j]);}
long int sum_lin(int i){
int j;
long sum=0;
 for(j=1;j<=m;++j){
	sum+=a[i][j];
 }
 return sum;
}
long int sum_tot(int *st){
 int i,j;
 long sum=0;

 for(i=1;i<=m;++i){
 if(st[i]==1) flip_col(i);}
 for(i=1;i<=n;++i){
	if(sum_lin(i)<=0) {a[i][0]=1;flip_lin(i);}
 }
 for(i=1;i<=n;++i)
 for(j=1;j<=m;++j)
	sum+=a[i][j];
 for(i=1;i<=n;++i){
 if(st[i]==1) flip_col(i);
 if (a[i][0]) flip_lin(i);a[i][0]=0;}


 return sum;
}

void init(int k,int *st)
{ st[k]=-1; }

int succesor(int k,int *st)
{if(st[k]<1){++st[k];return 1;}
 return 0; }

int valid(int k,int *st)
{return 1; }

int solutie(int k)
{
if(k==m){


 return 1;};
 return 0;}
void citire(){
FILE *in;
in=fopen("flip.in","r");
fscanf(in,"%d %d",&n,&m);
for(int i=1;i<=n;i++)
 for(int j=1;j<=m;j++){
 fscanf(in,"%ld",&a[i][j]); }
}
int main(){

int st[18];
long int suma=0,x=0,k=1,as,ev;
citire();
 init(k,st);
 while(k>0)
 {
	do {
	   as=succesor(k,st);
	   if(as) ev=valid(k,st);
	   } while(as&&!ev);
	if(as) if(solutie(k)){x=sum_tot(st);
											if(x>suma)suma=x;}
		else {k++;init(k,st);}
  else k--;
  }
FILE *out;
out=fopen("flip.out","w");
fprintf(out,"%ld",suma);
 return 0;
}