Cod sursa(job #297772)

Utilizator ConsstantinTabacu Raul Consstantin Data 5 aprilie 2009 16:32:07
Problema Castel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<stdio.h>

struct nod{int inf; nod*urm;} *cod[23000], *P;
int v[155][155],a[155][155],d[23000],viz[23000],i,j,k,l,p,q,c,m,n,L,C,x;
int dl[]={0,0,1,0,-1},dc[]={0,1,0,-1,0};

void ntoc(int x,int &l,int &c){
if(x%m==0){c=m;l=x/m;}
else
{c=x%m;l=x/m+1;}
}
int cton(int l,int c){
return (l-1)*m+c;
}

void solve(int x){
	nod *p;

	for(p=cod[x];p;p=p->urm)
		{d[++q]=p->inf;
		viz[p->inf]=1;
		if(cod[p->inf])solve(p->inf);
		}
	cod[x]=NULL;
}
void add(int x,int val){
 nod *p=new nod;
p->inf=val;
p->urm=cod[x];
cod[x]=p;
}
int main(){
	
	freopen("castel.in","r",stdin);
	freopen("castel.out","w",stdout);
	
	scanf("%d %d %d",&n,&m,&k);
	
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			scanf("%d",&v[i][j]);
	viz[k]=1;
	ntoc(k,L,C);
	d[1]=k;
	a[L][C]=1;
	p=q=1;

	for(i=1;i<=m;i++)
		a[0][i]=a[n+1][i]=1;
	for(i=1;i<=n+1;i++)
		a[i][0]=a[i][m+1]=1;
	while(p<=q){
		ntoc(d[p],l,c);
		for(i=1;i<=4;i++){
		L=l+dl[i];
		C=c+dc[i];
		x=cton(L,C);
		if(!a[L][C])
		if(viz[v[L][C]]){
			a[L][C]=1;
			viz[x]=1;
			d[++q]=x;
			if(cod[x])solve(x);
			}
		else
		
			{add(v[L][C],x);a[L][C]=1;}
	}
	p++;}

printf("%d",q);	
return 0;}