Cod sursa(job #568473)

Utilizator Robert29FMI Tilica Robert Robert29 Data 31 martie 2011 11:29:50
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<stdio.h>
FILE*f=fopen("barbar.in","r");
FILE*g=fopen("barbar.out","w");
int ok,nn,p,u,pp,uu,i,j,iv,jv,n,m,xf,yf,xs,ys,k,sol,a[2002][2002],vi[2000001],vj[2000001],ci[2000001],cj[2000001],x,viz[2000001];
int di[4]={0,1,0,-1};
int dj[4]={1,0,-1,0};
int main() {
	fscanf(f,"%d%d\n",&n,&nn);
	for(i=1;i<=n;++i){
		for(j=1;j<=nn;++j){
			fscanf(f,"%c",&x);
			if(x=='.')
				a[i][j]=0;
			else if(x=='*')
				a[i][j]=1;
			else if(x=='D'){
				vi[++k]=i;
				vj[k]=j;
				a[i][j]=-1;
			}
			else if(x=='I'){
				xs=i;
				ys=j;
			}else if(x=='O'){
				xf=i;
				yf=j;
			}
		}
		fscanf(f,"\n");
	}
	
	for(i=0;i<=n+1;++i)
		a[i][0]=a[i][nn+1]=1;
	for(i=0;i<=nn+1;++i)
		a[0][i]=a[n+1][i]=1;
	p=0;u=2000;
	
	while(p<=u){
		m=(p+u)/2;
		pp=1;
		uu=k;
		ok=1;
		while(pp<=uu&&ok){
			i=vi[pp];
			j=vj[pp];
			
			if(!m)
				for(i=1;i<=k;++i)
					a[vi[i]][vj[i]]=-1;
			
			for(int d=0;d<4;++d){
				
				iv=i+di[d];
				jv=j+dj[d];
				if(a[iv][jv]==0){
					if(viz[pp]-1<-m){
						ok=0;
						break;
					}
					vi[++uu]=iv;
					vj[uu]=jv;
					viz[uu]=viz[pp]-1;
					a[iv][jv]=-1;
				}
			
			}
			++pp;
		}
		
		pp=1;
		uu=1;
		ci[1]=xs;
		cj[1]=ys;
		ok=1;
		sol=0;
		while(ok&&pp<=uu){
			i=ci[pp];
			j=cj[pp];
			for(int d=0;d<4;++d){
				iv=i+di[d];
				jv=j+dj[d];
				if(iv==xf&&jv==yf){
					ok=0;
					sol=1;
					break;
				}
				if(a[iv][jv]==0){
					ci[++uu]=iv;
					cj[uu]=jv;
					a[iv][jv]=-1;
				}
			}
			++pp;
		}
		
		if(sol)
			p=m+1;
		else
			u=m-1;
		
		for(i=1;i<=n;++i)
			for(j=1;j<=nn;++j)
				if(a[i][j]<0)
					a[i][j]=0;
	}
	
	fprintf(g,"%d",u+1);
	fclose(g);
	fclose(f);
	return 0;
}