Cod sursa(job #61366)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 19 mai 2007 09:15:28
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#define fin  "castel.in"
#define fout "castel.out"
#define Nmax 151

struct nod { int x; int y; };

int map[Nmax][Nmax],key[Nmax];
int M,N,P;
nod t1[Nmax*Nmax],t2[Nmax*Nmax];
int d1,d2,ok,ret;

int exp(int x,int y) {
	if (x<1 || y<1 || x>M || y>N)
		return 1;
	if (map[x][y]==-1)
		return 1;
	if ( key[map[x][y]] == 1 ) {
		t2[++d2].x=x;
		t2[d2].y=y;
		ok=1;
		key[(x-1)*N+y]=1;
		map[x][y]=-1;
		++ret;
		return 1;
	}
	else
		return 0;
}

void bf() {
int i,x,y,e;
	d2=0; ok=0;
	for (i=1;i<=d1;++i) {
		e=1; x=t1[i].x; y=t1[i].y;
		e=( e & exp(x-1,y) );
		e=( e & exp(x+1,y) );
		e=( e & exp(x,y+1) );
		e=( e & exp(x,y-1) );	
		if (!e) {
			t2[++d2].x=x;
			t2[d2].y=y;
		}
	}

	if ( !ok ) 
		return ;

	for (i=1;i<=d2;++i)
		t1[i]=t2[i];
	d1=d2;

	bf();
}

int main() {
int i,j,k=0;
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d%d%d",&M,&N,&P);

	for (i=1;i<=M;++i)
	for (j=1;j<=N;++j) {
		scanf("%d",&map[i][j]);
		++k; 
		if (k==P) {
			t1[1].x=i; t1[1].y=j;
			map[i][j]=-1;
			key[P]=1; ret=1;
		}
	}
	
	d1=1;

	bf();

	printf("%d\n",ret);

	return 0;
}