Cod sursa(job #23118)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 28 februarie 2007 09:59:54
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include<stdio.h>
long int a[17][17],tl[17],tc[17],s;
int nc,nl,i,j,ok;
int flipl(int fi)
{       int js;
	for(js=1;js<=nc;js++){a[fi][js]=-a[fi][js];
			      tc[js]+=2*a[fi][js];
			      tl[fi]+=2*a[fi][js];
			      }
	return 0;
}
int flipc(int fj)
{       int is;
	for(is=1;is<=nl;is++){a[is][fj]=-a[is][fj];
			      tl[is]+=2*a[is][fj];
			      tc[fj]+=2*a[is][fj];}
	return 0;
}
int badl(int ib)
{
	int js;
	for(js=1;js<=nc;js++)
	if((tc[js]-2*a[ib][js])<0) return 1;
	return 0;
}
int badc(int jb)
{
	int is;
	for(is=1;is<=nl;is++)
	if((tc[is]-2*a[is][jb])<0) return 1;
	return 0;
}

int main()
{
	FILE *f;
	f=fopen("flip.in","r");
	fscanf(f,"%d%d",&nl,&nc);
	for(i=1;i<=nl;i++)
	for(j=1;j<=nc;j++)
	{fscanf(f,"%ld",&a[i][j]);
	tl[i]+=a[i][j];
	tc[j]+=a[i][j];
	}
	do{
	ok=1;
	for(i=1;i<=nl;i++)if(tl[i]<0){flipl(i);ok=0;}
	if(ok) for(j=1;j<=nc;j++)if(tc[j]<0){flipc(j);ok=0;}
	if(ok) for(i=1;i<=nl;i++) if(tl[i]==0) if(badl(i)){flipl(i);ok=0;}
	if(ok) for(j=1;j<=nl;j++) if(tc[i]==0) if(badc(i)){flipc(i);ok=0;}
	}while(ok==0);
	fclose(f);
	f=fopen("flip.out","w");
	for(i=1;i<=nl;i++)s+=tl[i];
	fprintf(f,"%ld\n",s);
	fclose(f);
	return 0;
}