Cod sursa(job #281448)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 14 martie 2009 21:43:09
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<stdio.h>

#define inter(a,b) { a^=b; b^=a; a^=b; }

void citire(long a[17][17], int &n, int &m, long *b, int *c, int *d, int &k)
{
 int i,j;
 long s;
 k=0;
 freopen("flip.in","r",stdin);
 freopen("flip.out","w",stdout);
 scanf("%d%d",&n,&m);
 for(i=1; i<=n; i++)
 {
  s=0;
  for(j=1; j<=m; j++)
  {
   scanf("%ld",&a[i][j]);
   s+=a[i][j];
  }
  //printf("%ld ",s);
  if(s<0) { b[++k]=s; c[k]=0; d[k]=i; }
 }
 //printf("\n");
 for(i=1; i<=m; i++)
 {
  s=0;
  for(j=1; j<=n; j++) s+=a[j][i];
  //printf("%ld ",s);
  if(s<0) { b[++k]=s; c[k]=1; d[k]=i; }
 }
}

void ordonare(int *c, long *b, int *d, int k)
{
 int i,j;
 for(i=1; i<k; i++)
 for(j=i+1; j<=k; j++)
 if(b[i]>b[j])
 {
  inter(b[i],b[j]);
  inter(c[i],c[j]);
  inter(d[i],d[j]);
 }
}

void flip(int *c, int *d, int poz, long a[17][17], int n, int m)
{
 int i;
 if(c[poz]==0) for(i=1; i<=m; i++) a[d[poz]][i]=-a[d[poz]][i];
	  else for(i=1; i<=n; i++) a[i][d[poz]]=-a[i][d[poz]];
}

void afisare(long a[17][17], int n, int m)
{
 int i,j;
 long s=0;
 for(i=1; i<=n; i++)
 for(j=1; j<=m; j++)
   s+=a[i][j];
 printf("%ld\n",s);
}

int main()
{
 int j,d[289],i,c[289],n,m,k;
 long a[17][17],b[289];
 citire(a,n,m,b,c,d,k);
 /*printf("\n\n");
 for(i=1; i<=n; i++)
 {
  for(j=1; j<=m; j++) printf("%ld ",a[i][j]);
  printf("\n");
 }
 printf("\n");*/
 ordonare(c,b,d,k);
 for(i=1; i<=k; i++)
   {
    flip(c,d,i,a,n,m);
    //printf("%ld %d %d\n",b[i],c[i],d[i]);
   }
 afisare(a,n,m);
 return 0;
}