Cod sursa(job #80599)

Utilizator Astrid28Ruxandra Cohal Astrid28 Data 28 august 2007 20:11:15
Problema Jocul Flip Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>

int n,m;
long nr[16][16];
long s;
struct valori
       {long p,n;}l[16],c[16];
FILE *fin,*fout;


void adaugare(int i,int j)
{
  if (nr[i][j]>0) {l[i].p+=nr[i][j]; c[j].p+=nr[i][j];}
	 else {l[i].n+=nr[i][j]; c[j].n+=nr[i][j];}
}



void citire()
{
  int i,j;
  fin=fopen("flip.in","r");
  fout=fopen("flip.out","w");
  fscanf(fin,"%d %d",&n,&m);
  for (i=0;i<n;i++)
    for (j=0;j<m;j++)
      {fscanf(fin,"%ld",&nr[i][j]);
       adaugare(i,j);
       s+=nr[i][j];
      }
  fclose(fin);
}


void calculeaza()
{
  int i,j,k1,k2;
  long d1,d2,aux;
  d1=d2=0;
  for (i=0;i<n;i++)
    if (-l[i].p-l[i].n>d1) {d1=-l[i].p-l[i].n;
			    k1=i;}
  for (j=0;j<m;j++)
    if (-c[j].p-c[j].n>d2) {d2=-c[j].p-c[j].n;
			    k2=j;}
  if (d1>=d2&&d1>0)
    {
      l[k1].p=-l[k1].p;l[k1].n=-l[k1].n;
      aux=l[k1].p;l[k1].p=l[k1].n;l[k1].n=aux;

      s+=2*(l[k1].p+l[k1].n);
      for (j=0;j<m;j++)
	{nr[k1][j]=-nr[k1][j];
	 c[j].p+=nr[k1][j];
	 c[j].n+=nr[k1][j];}

      calculeaza();
    }
   else if (d2>d1&&d2>0)
	  {
	    c[k2].p=-c[k2].p; c[k2].n=-c[k2].n;
	    aux=c[k2].p;c[k2].p=c[k2].n;c[k2].n=aux;

	    s+=2*(c[k2].p+c[k2].n);
	    for (i=0;i<n;i++)
	      {nr[i][k2]=-nr[i][k2];
	       l[i].p+=nr[i][k2];
	       l[i].n+=nr[i][k2];}

	    calculeaza();
	  }


}



void afisare()
{
  fprintf(fout,"%ld\n",s);
  fclose(fout);
}



int main()
{
  s=0;
  citire();
  calculeaza();
  afisare();
  return 0;
}