Cod sursa(job #648904)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 14 decembrie 2011 19:47:25
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream.h>
#define val 1008
int di[]={1 , -1 , 0 , 0};
int dj[]={0 , 0 , 1 , -1};
int i , j , m , n , k ,d , x1 , x2 , y1 , y2 , min=-1 , st , dr;
char a[val];
int V[val][val];
int C[2][val*val];
void coada1(){
	int p=1,u=k;
	int iv , jv , ic , jc;	
	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&&V[iv][jv]!=1&&V[iv][jv]>=0){
				if(V[iv][jv]==0)
					V[iv][jv]=V[ic][jc]+1;
				else
					if(V[iv][jv]>V[ic][jc]+1)
						V[iv][jv]=V[ic][jc]+1;
				C[0][++u]=iv;
				C[1][u]=jv;
			}
		}
		p++;
	}
}
int coada(int z){
	int p=1,u=1;
	C[0][1]=x1;
	C[1][1]=y1;
	int Z[val][val];
	int iv , jv , ic , jc , iv1 , jv1 , d1;
	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]==0 && V[iv][jv]-1<=z && V[iv][jv]!=1 && V[iv][jv]>0){
				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(){
	ifstream f("barbar.in");
	ofstream g("barbar.out");
	f>>n>>m;
	for(i=1;i<=n;i++){
		f>>a;
		for(j=1;j<=m;j++){
			if(a[j-1]=='*')
				V[i][j]=-1;
			if(a[j-1]=='D'){
				V[i][j]=1;
				C[0][++k]=i;
				C[1][k]=j;
			}
			if(a[j-1]=='I'){
				x1=i;y1=j;
			}
			if(a[j-1]=='O'){
				x2=i;y2=j;
			}
		}
	}
	coada1();
	st=1;dr=n+m;
	while(st<=dr){
		k=(st+dr)/2;
		if(coada(k)){
			st=k+1;			
			min=k;
		}
		else{
			dr=k-1;
		}
	}
	if(min>0)
		printf("%d",min);
	else
		printf("%d",-1);
	return 0;
}