Cod sursa(job #55061)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 26 aprilie 2007 11:45:53
Problema Castel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
long int m,n,k,mark[225],t,i,a[225],l,ll,x[900],y[900],sol,soll,p;
int main()
{
	FILE *f,*g;
	f=fopen("castel.in","r");
	g=fopen("castel.out","w");
	fscanf(f,"%ld%ld%ld",&m,&n,&k);
	mark[k]=1;sol=1;
	t=m*n;p=k;
	if(p-n>0){l++;x[l]=p;y[l]=p-n;}
	if(p+n<=t){l++;x[l]=p;y[l]=p+n;}
	if(p%n!=1){l++;x[l]=p;y[l]=p-1;}
	if(p%n){l++;x[l]=p;y[l]=p+1;}
	for(i=1;i<=t;i++)
	{ fscanf(f,"%ld",&a[i]);
       /*	  if(i-n>0){l++;x[l]=i;y[l]=i-n;}
	  if(i+n<=t){l++;x[l]=i;y[l]=i+n;}
	  if((i%n)!=1){l++;x[l]=i;y[l]=i-1;}
	  if(i%n){l++;x[l]=i;y[l]=i+1;}
       */	}
	do
	{
	  ll=l;soll=sol;
	   for(i=1;i<=l;i++)
	    {
	       if(mark[y[i]]) { x[i]=x[l];x[l]=0;y[i]=y[l];y[l]=0;l--;}
	       else if(mark[x[i]])
		 if(mark[a[y[i]]])
		  { mark[y[i]]=1;p=y[i];x[i]=x[l];x[l]=0;y[i]=y[l];y[l]=0;
		    l--;sol++;
		    if(p-n>0){l++;x[l]=p;y[l]=p-n;}
		    if(p+n<=t){l++;x[l]=p;y[l]=p+n;}
		    if(p%n!=1){l++;x[l]=p;y[l]=p-1;}
		    if(p%n){l++;x[l]=p;y[l]=p+1;}
		  }
	     }
	 }while(soll<sol);
	 fprintf(g,"%ld\n",sol);
	 fcloseall();
	 return 0;
}