Cod sursa(job #136211)

Utilizator znakeuJurba Andrei znakeu Data 15 februarie 2008 12:15:12
Problema Castel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#define NMMAX 160
int n,m,k;
int v[NMMAX][NMMAX];
int w[NMMAX*NMMAX];
int u[NMMAX*NMMAX],q;
int lst[NMMAX][NMMAX];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int main()
{
	FILE *in  = fopen("castel.in","r");
	FILE *out = fopen("castel.out","w");
	
	int i,j,a,x,y,s=0;
	
	fscanf(in,"%d%d%d",&n,&m,&k);
	for (i=0; i<n; i++)
		for (j=0; j<m; j++)
		{
			fscanf(in,"%d",&v[i][j]);
			v[i][j]--;
			lst[v[i][j]][++lst[v[i][j]][0]]=i*m+j;
		}
	
	for (i=0; i<4; i++)
		dx[i]*=m;
	k--; w[k]=-2; u[0]=k;	q=1;
	
	for (i=0; i<q; i++)
	{
		a=u[i];
		for (j=1; j<=lst[a][0]; j++)
		{
			if(w[lst[a][j]]==0)
			{
				w[lst[a][j]]=-3;
			}
			if(w[lst[a][j]]==-1)
			{
				w[lst[a][j]]=-2;
				u[q++]=lst[a][j];				
			}
		}
		for (j=0; j<4; j++)
			if (a+dx[j]+dy[j]>=0 && a+dx[j]+dy[j]<n*m)
			{
				if (w[a+dx[j]+dy[j]]==0)
				{
					w[a+dx[j]+dy[j]]=-1;
				}
				if (w[a+dx[j]+dy[j]]==-3)
				{
					w[a+dx[j]+dy[j]]=-2;
					u[q++]=a+dx[j]+dy[j];					
				}
			}
	}	
	fprintf(out,"%d\n",q);
	fclose(in);
	fclose(out);
	return 0;
}