Cod sursa(job #519303)

Utilizator lianaliana tucar liana Data 4 ianuarie 2011 21:14:25
Problema Castel Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <stdio.h>
int n, m, k, i, j, inc, sf, cam;
int co[22503], ad[5], ac[22503][200], nev[22503];
bool viz[22503];

void initializare()
{
	ad[1]=-m; ad[2]=-1; ad[3]=1; ad[4]=m;	
}

void citire()
{
	scanf("%ld %ld %d",&n,&m,&k);
	initializare();
	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			scanf("%ld",&nev[(i-1)*m+j]);
}

void rezolvare()
{
	co[1]=k;
	viz[k]=true;
	inc=1;
	sf=1;
	while (inc<=sf)
	{
		cam=co[inc];	inc++;
		for (i=1;i<=ac[cam][0];i++)
			if (viz[ac[cam][i]]==false)
			{
				viz[ac[cam][i]]=true;
				sf++; co[sf]=ac[cam][i];
			}
		for (i=1;i<=4;i++)
			if ((cam+ad[i]>0) and (cam+ad[i]<=n*m) and ((cam%m>0) or (i!=3)) and ((cam%m!=1) or (i!=2)))
			if ((viz[nev[cam+ad[i]]]==true) and (viz[cam+ad[i]]==false))
			{
				sf++; 
				co[sf]=cam+ad[i];
				viz[cam+ad[i]]=true;
			}
			else
			{
				ac[nev[cam+ad[i]]][0]++;
				ac[nev[cam+ad[i]]][ac[nev[cam+ad[i]]][0]]=cam+ad[i];
			}
			
	}
	printf("%ld",sf);
	
}

int main()
{
	freopen("castel.in","r",stdin);
	freopen("castel.out","w",stdout);
	citire();
	rezolvare();
	return 0;
}