Cod sursa(job #135843)

Utilizator znakeuJurba Andrei znakeu Data 14 februarie 2008 18:35:11
Problema Castel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <stdio.h>
int n,m,k;
int v[155][155];
int vtf[155][155];
int key[22505];
int v1[22505],k1;
int v2[22505],k2;

void wtf(int a)
{
	int x=a/m,y=a%m;
	if (x-1>-1)
		if (vtf[x-1][y]>-2)
			if (key[v[x-1][y]])
			{
				vtf[x-1][y]=-2;
				v1[k1++]=(x-1)*m+y;
				key[(x-1)*m+y]=1;
			}
			else
			{
				vtf[x-1][y]=-1;
				v2[k2++]=(x-1)*m+y;		
			}
	if (x+1<n)
		if (vtf[x+1][y]>-2)
			if (key[v[x+1][y]])
			{
				vtf[x+1][y]=-2;
				v1[k1++]=(x+1)*m+y;
				key[(x+1)*m+y]=1;
			}
			else
			{
				vtf[x+1][y]=-1;
				v2[k2++]=(x+1)*m+y;		
			}
	if (y-1>-1)
		if (vtf[x][y-1]>-2)
			if (key[v[x][y-1]])
			{
				vtf[x][y-1]=-2;
				v1[k1++]=x*m+y-1;
				key[x*m+y-1]=1;
			}
			else
			{
				vtf[x][y-1]=-1;
				v2[k2++]=x*m+y-1;		
			}
	if (y+1<m)
		if (vtf[x][y+1]>-2)
			if (key[v[x][y+1]])
			{
				vtf[x][y+1]=-2;
				v1[k1++]=x*m+y+1;
				key[x*m+y+1]=1;
			}
			else
			{
				vtf[x][y+1]=-1;
				v2[k2++]=x*m+y+1;		
			}
}

int main()
{
	FILE *in  = fopen("castel.in","r");
	FILE *out = fopen("castel.out","w");
	
	int i,j;
	
	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]--;
		}
	k--;
	key[k]=1; v1[0]=k; k1=1; k2=0; i=0; j=0;
	vtf[k/m][k%m]=-2;
	
	while (i<k1 || j<k2)
	{
		if (i<k1)
		{
			wtf(v1[i]);
			i++;
		}
		else
		{
			if (key[ v[v2[j]/m][v2[j]%m] ])
			{
				v1[k1++]=v2[j];
				vtf[v2[j]/m][v2[j]%m]=-2;
			}
			j++;			
		}
	}
	
	int s=0;
	for (i=0; i<n; i++)
		for (j=0; j<m; j++)
			if (vtf[i][j]==-2)
				s++;
	
	fprintf(out,"%d\n",s);
	fclose(in);
	fclose(out);
	return 0;
}