Cod sursa(job #55173)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 26 aprilie 2007 17:32:21
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<stdio.h>
long int m,n,k,mark[22501],t,i,a[22501],l,ll,x[90005],y[90005],sol,soll,p,ok;
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
	{
	   ok=0;
	   ll=l;
	   for(i=1;i<=ll;i++)
	   if(!mark[y[i]])
	    if(mark[x[i]])
	     if(mark[a[y[i]]])
	       { mark[y[i]]=1;p=y[i];
		  sol++;
		  if(p-n>0)  {if(!mark[p-n]){l++;x[l]=p;y[l]=p-n;ok=1;}}
		  if(p+n<=t) {if(!mark[p+n]){l++;x[l]=p;y[l]=p+n;ok=1;}}
		  if(p%n!=1) {if(!mark[p-1]){l++;x[l]=p;y[l]=p-1;ok=1;}}
		  if(p%n)    {if(!mark[p+1]){l++;x[l]=p;y[l]=p+1;ok=1;}}
		  x[i]=x[l];y[i]=y[l];x[l]=0;y[l]=0;l--;
		}
	  }while(ok);
	 fprintf(g,"%ld\n",sol);
	 fcloseall();
	 return 0;
}