Cod sursa(job #650012)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 17 decembrie 2011 10:46:08
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#define val 1001
int di[]={1 , -1 , 0 , 0};
int dj[]={0 , 0 , 1 , -1};
int i , j , n , m , ic , jc , iv , jv , d , x1 , y1 , x2 , y2 , d1 , iv1 , jv1 , mid , st , dr , p , u;
char a[val];
int C[2][val*val];
int V[val][val];
void coada1(){
	char Z[val][val];
	for(int q=1;q<=n;q++){
		for(int w=1;w<=m;w++){
			Z[q][w]=0;
		}
	}
	Z[i][j]=1;
	p=1;u=1;
	while(p<=u){
		ic=C[0][p];
		jc=C[1][p];
		for(d=0;d<=3;d++){
			iv=ic+di[d];
			jv=jc+dj[d];
			if(iv>=1 && iv<=n && jv>=1 && jv<=m && !Z[iv][jv] && V[iv][jv]>=0 && V[iv][jv]!=1){
				if(V[iv][jv]==0){
					V[iv][jv]=1+V[ic][jc];
				}
				else
					if(V[iv][jv]>V[ic][jc]+1)
						V[iv][jv]=V[ic][jc]+1;
				C[0][++u]=iv;
				C[1][u]=jv;
				Z[iv][jv]=1;
			}
		}
		p++;
	}
}
int coada(int maxim){
	p=1;u=1;
	C[0][p]=x1;C[1][p]=y1;
	char Z[val][val];
	for(int q=1;q<=n;q++){
		for(int w=1;w<=m;w++){
			Z[q][w]=0;
		}
	}
	Z[x1][y1]=1;
	while(p<=u){
		ic=C[0][p];
		jc=C[1][p];
		for(d=0;d<=3;d++){
			iv=ic+di[d];
			jv=jc+dj[d];
			if(iv>=1 && iv<=n && jv>=1 && jv<=m && !Z[iv][jv] && (V[iv][jv]-1)>=maxim){
				Z[iv][jv]=1;
				C[0][++u]=iv;
				C[1][u]=jv;
				for(d1=0;d1<=3;d1++){
					iv1=iv+di[d1];
					jv1=jv+dj[d1];
					if(iv1==x2&&jv1==y2)
						return 1;
				}
			}
		}
		p++;
	}
	return 0;
}
int main(){
	freopen("barbar.in","r",stdin);
	freopen("barbar.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){
		scanf("%s",a);
		for(j=1;j<=m;j++){
			if(a[j-1]=='D'){
				V[i][j]=1;				
			}
			if(a[j-1]=='*')
				V[i][j]=-1;
			if(a[j-1]=='I'){
				x1=i;y1=j;
			}
			if(a[j-1]=='O'){
				x2=i;y2=j;
			}
		}		
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			if(V[i][j]==1){
				C[0][1]=i;
				C[1][1]=j;
				coada1();
			}
		}
	}
	st=1;dr=n+m;
	while(st<=dr){
		mid=(st+dr)/2;
		if(coada(mid)){
			st=mid+1;
		}
		else{
			dr=mid-1;
		}
	}
	mid=(st+dr)/2;
	if(coada(mid))
		printf("%d",mid);
	else
		printf("%d",-1);
	return 0;
}