Cod sursa(job #23318)

Utilizator lluckyLuca Vlad llucky Data 28 februarie 2007 17:13:02
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<stdio.h>

int n,m,smax=0,s[17];
int a[17][17];

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

int init(int k) {s[k]=s[k-1]; return 1;}
int succesor(int k) {if(s[k]<n) {s[k]++; return 1;} return 0;}
int valid(int k) {
int i;
for(i=1;i<k;i++) if(s[i]==s[k]) return 0;
return 1;
}
int solutie(int k)
{
int ss=0,i,j,si,v[17][17];
for(i=1;i<=n;i++)
 for(j=1; j<=m; j++)
	v[i][j]=a[i][j];
for(i=1;i<=k;i++)
 for(j=1;j<=m;j++) v[s[i]][j]=v[s[i]][j]*(-1);

for(j=1;j<=m;j++)
 {
	si=0;
	for(i=1;i<=n;i++) si=si+v[i][j];
	if(si<0) si=si*(-1);
	ss+=si;
 }
if (ss>smax) {smax=ss; return 1;}
return 0;
}
int tipar (int k)
{
FILE *f;
f=fopen("flip.out","w");
fprintf(f,"%d\n",smax);
fclose(f);
return 1;
}


int main (void)
{
int as,ev,k;
citire();
k=1;
init(k);
while(k>0)
 {
  do{
     as=succesor(k);
     if(as) ev=valid(k);
  }while(as&&!ev);
  if(as)
   {
		if(solutie(k)) {tipar(k); if(k<n) k++;}
    else if(k>n) k--;
         else {k++; init(k);}
   }
  else k--;
 }
return 0;
}