Cod sursa(job #579734)

Utilizator RengelBotocan Bogdan Rengel Data 12 aprilie 2011 13:46:21
Problema Castel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<cstdio>

int a[160][160];
int b[160][160];
int c[160][160];
int key[25000];
int cd_u[25000];
int cd_d[25000];
int n,m,p,i,sw,max=1;
int first=1,last=1;

void read(){
	
	int c;
	scanf("%d%d%d",&n,&m,&c);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			scanf("%d",&a[i][j]);
			b[i][j]=(i-1)*m+j;
			if(b[i][j]==c){
				cd_u[1]=i;
				cd_d[1]=j;
			}
		}
	
	
}

int state(int x,int y){
	
	if(x<1) return 0;
	if(y<1) return 0;
	if(x>n) return 0;
	if(y>m) return 0;
	if(c[x][y]) return 0;
	return 1;
	
}

void coada(int x,int y){
	
	c[x][y]=1;
	max++;
	cd_u[++last]=x;
	cd_d[last]=y;
	sw=0;
	
}

void fill(int x,int y){
	
	if(state(x+1,y) && key[a[x+1][y]]){
		coada(x+1,y);
		key[b[x+1][y]]=1;
	}
	if(state(x-1,y) && key[a[x-1][y]]){
		coada(x-1,y);
		key[b[x-1][y]]=1;
	}
	if(state(x,y+1) && key[a[x][y+1]]){
		coada(x,y+1);
		key[b[x][y+1]]=1;
	}
	if(state(x,y-1) && key[a[x][y-1]]){
		coada(x,y-1);
		key[b[x][y-1]]=1;
	}
	
}

int main(){
	
	freopen("castel.in","r",stdin);
	freopen("castel.out","w",stdout);
	
	read();
	
	c[cd_u[1]][cd_d[1]]=1;
	key[b[cd_u[1]][cd_d[1]]]=1;
	
	while(!sw){
		
		sw=1;
		p=last;
		for(i=first;i<=p;i++)
			fill(cd_u[i],cd_d[i]);
		first=p+1;
		
	}
	
	printf("%d",max);
	
	return 0;
	
}