Cod sursa(job #1926)

Utilizator DragoshZZabava Dragos DragoshZ Data 15 decembrie 2006 14:04:54
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<fstream.h>
#include<iostream.h>
fstream f("flip.in",ios::in);
fstream g("flip.out",ios::out);
 int n,k,m,as,ev,max=-32000,a[20][20],x[40],s,okl=0,okc=0;
 int l[17],c[17];
void citire()
{ f>>n>>m;
  int i,j,sl,sc;
   for(i=1;i<=n;i++)
	{sl=0;
	for(j=1;j<=m;j++)
		{f>>a[i][j];    sl+=a[i][j];}
	l[i]=sl; sl=0;
	}
   for(j=1;j<=m;j++)
	{ sc=0;
	 for(i=1;i<=n;i++)
		sc=a[i][j];
	 c[j]=sc; sc=0;
	}
   f.close();
}

void init()
{ x[k]=-3;
}

int succesor()
{ if(x[k]<1)
	{x[k]+=2;
	if(k<=n&&x[k]==1) okl++;
	if(k>n&&x[k]==1) okc++;
	return 1;}

return 0;
}

int valid()
{ return 1;
}

int solutie()
{ return (k==n+m);
}

void tipar()
{ int i,j,s=0;
    if (okl==n)
	for(i=1;i<=n;i++)
		s+=l[i]*x[i];
    else
      if(okc==m)
	for(i=1;i<=m;i++)
		s+=c[i]*x[n+i];
    else
   { for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
		s+=a[i][j]*x[i]*x[n+j] ;}
    if(s>max)
      max=s;
}
void back()
{ k=1;
  init();
  while(k>0)
  { /* do */
    as=succesor();
    /*if(as)
	ev=valid();*/

  /*while(!as);*/
  if(as)
	 if(solutie())
		tipar();
	 else
		{k++;init();}
  else
	{k--; if(k<=n&&x[k]==1) okl--;
	 if(k>n&&x[k]==1) okc--;}
  }
}
int main()
{  citire();
  back();
  g<<max;
  g.close();
  return 0;
}