Cod sursa(job #298256)

Utilizator iamdoruTanase Theodor iamdoru Data 5 aprilie 2009 22:53:28
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.31 kb
#include<stdio.h>
typedef struct el{int x,y;};
typedef struct v{int nr,cheie;};
FILE *f,*g;
int i,m,n,j,p,u,sem[3600],k,q,t,max=0;
el c[3600];
v cam[60][60];
int main()
{
f=fopen("castel.in","r");
fscanf(f,"%d %d%d",&m,&n,&k);
for(i=1;i<=m;i++)
	for(j=1;j<=n;j++){ fscanf(f,"%d",&cam[i][j].cheie); cam[i][j].nr=0;}
fclose(f);    	
for(i=1;i<=n*m;i++) sem[i]=0;
p=1;
u=1;
if(k%n==0){c[1].x=k/n;
	c[1].y=n;}
else { c[1].x=k/n+1;
	c[1].y=k%n;}
sem[k]=1;
while(p<=u)
	{ if(c[p].x!=1){     if(c[p].y!=n)  q=(c[p].x-2)*n+c[p].y;	
			     else  	q=(c[p].x-1)*n;
		if(sem[cam[c[p].x-1][c[p].y].cheie]==1){u++;
				    c[u].x=c[p].x-1;
				    c[u].y=c[p].y;
				    if(cam[c[u].x][c[u].y].nr==0){
						cam[c[u].x][c[u].y].nr=cam[c[p].x][c[p].y].nr+1;
						if(cam[c[u].x][c[u].y].nr>max)
							max=cam[c[u].x][c[u].y].nr;
						for(t=1;t<p;t++){
							if(c[t].x!=1)
								if(cam[c[t].x-1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x-1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=n)
								if(cam[c[t].x][c[t].y+1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y+1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].x!=m)
								if(cam[c[t].x+1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x+1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=1)
								if(cam[c[t].x][c[t].y-1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y-1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
											  } }
				    sem[q]=1;					
						}}
	  if(c[p].y!=n){     if(c[p].y+1!=n)  q=(c[p].x-1)*n+c[p].y+1;
			     else  	q=c[p].x*n;
		if(sem[cam[c[p].x][c[p].y+1].cheie]==1){u++;
				    c[u].x=c[p].x;
				    c[u].y=c[p].y+1;
				    if(cam[c[u].x][c[u].y].nr==0){
						cam[c[u].x][c[u].y].nr=cam[c[p].x][c[p].y].nr+1;
						if(cam[c[u].x][c[u].y].nr>max)
							max=cam[c[u].x][c[u].y].nr;
						for(t=1;t<p;t++){
							if(c[t].x!=1)
								if(cam[c[t].x-1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x-1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=n)
								if(cam[c[t].x][c[t].y+1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y+1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].x!=m)
								if(cam[c[t].x+1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x+1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=1)
								if(cam[c[t].x][c[t].y-1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y-1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
											  } }
				    sem[q]=1;					
						}}
	 if(c[p].x!=m){     if(c[p].y!=n)  q=(c[p].x)*n+c[p].y;
			     else  	q=(c[p].x+1)*n;
		if(sem[cam[c[p].x+1][c[p].y].cheie]==1){u++;
				    c[u].x=c[p].x+1;
				    c[u].y=c[p].y;
				    if(cam[c[u].x][c[u].y].nr==0){
						cam[c[u].x][c[u].y].nr=cam[c[p].x][c[p].y].nr+1;
						if(cam[c[u].x][c[u].y].nr>max)
							max=cam[c[u].x][c[u].y].nr;
						for(t=1;t<p;t++){
							if(c[t].x!=1)
								if(cam[c[t].x-1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x-1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=n)
								if(cam[c[t].x][c[t].y+1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y+1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].x!=m)
								if(cam[c[t].x+1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x+1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=1)
								if(cam[c[t].x][c[t].y-1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y-1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
											  } }
				    sem[q]=1;					
						}}
	   if(c[p].y!=1){     if(c[p].y!=n)  q=(c[p].x-1)*n+c[p].y-1;
			     else  	q=c[p].x*n;
		if(sem[cam[c[p].x][c[p].y-1].cheie]==1){u++;
				    c[u].x=c[p].x;
				    c[u].y=c[p].y-1;
				    if(cam[c[u].x][c[u].y].nr==0){
						cam[c[u].x][c[u].y].nr=cam[c[p].x][c[p].y].nr+1;
						if(cam[c[u].x][c[u].y].nr>max)
							max=cam[c[u].x][c[u].y].nr;
						for(t=1;t<p;t++){
							if(c[t].x!=1)
								if(cam[c[t].x-1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x-1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=n)
								if(cam[c[t].x][c[t].y+1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y+1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].x!=m)
								if(cam[c[t].x+1][c[t].y].nr==q){u++;
										   c[u].x=c[t].x+1;
										   c[u].y=c[t].y;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
							if(c[t].y!=1)
								if(cam[c[t].x][c[t].y-1].nr==q){u++;
										   c[u].x=c[t].x;
										   c[u].y=c[t].y-1;
										   cam[c[u].x][c[u].y].nr=max+1;
										   max++;	}
											  } }
				    sem[q]=1;					
						}}
p++;	}
g=fopen("castel.out","w");
fprintf(g,"%d\n",max);
fclose(g);
return 0;}