Cod sursa(job #47464)

Utilizator lorin_bobuBobulisteanu Lorin lorin_bobu Data 3 aprilie 2007 18:56:14
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<stdio.h>

FILE *f=fopen("flip.in","r"), *g=fopen("flip.out","w");

int n,m,v[16][16],w[16][16],i,j;
long smax=0;

void flipr(int a) {
   for(int x=0;x<m;x++) w[a][x]=-w[a][x];
}

void flipc(int b) {
   for(int y=0;y<n;y++) w[y][b]=-w[y][b];
}

void copiere() {
   for(int i=0;i<n;i++)
      for(int j=0;j<m;j++)
	 w[i][j]=v[i][j];
}

long sum_w() {
   long s=0;
   for(int i=0;i<n;i++)
      for(int j=0;j<m;j++)
	 s+=w[i][j];
   return s;
}

void copy_r(int i) {
   for(int j=0;j<m;j++) v[i][j]=w[i][j];
}

void copy_c(int j) {
   for(int i=0;i<m;i++) v[i][j]=w[i][j];
}

int main() {
   fscanf(f,"%d",&n);
   fscanf(f,"%d",&m);
   for(i=0;i<n;i++)
      for(j=0;j<m;j++) {
	  fscanf(f,"%d",&v[i][j]);
	  smax+=v[i][j];
      }
   int bun=1,x,y;
   while(bun) {
      x=0; y=0;
      for(i=0;i<n;i++) {
	 copiere();
	 flipr(i);
	 if(sum_w()>smax) {
	    smax=sum_w(); x++;
	    copy_r(i);
	 }
      }
      for(j=0;j<m;j++) {
	 copiere();
	 flipc(j);
	 if(sum_w()>smax) {
	    smax=sum_w(); y++;
	    copy_c(j);
	 }
      }
      if(x==0 && y==0) bun=0;
      else bun=1;
      if(bun);
   }
   fprintf(g,"%ld",smax);
   fclose(f);
   fclose(g);
   return 0;
}