Cod sursa(job #362787)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 10 noiembrie 2009 22:54:30
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<fstream.h>
ifstream f("barbar.in");
ofstream g("barbar.out");
int dragon[2][100001],a[1001][1001],viz[1001][1001],dl[4]={0,1,0,-1},dc[4]={1,0,-1,0};
char c;
int u1,p1,m,n,u,p,lstart,cstart,ldest,cdest,i,j,k,d,x,q,w,min,y,v[2][100001];
void curata(){
	int i,j;
	for(i=1;i<=m;i++)
		for(j=1;j<=n;j++)
			 viz[i][j]=0;
}
void verifica(int x){
	curata();
	viz[lstart][cstart]=1;
	u1=1;p1=1;
	v[0][1]=lstart;
	v[1][1]=cstart;
        if(a[lstart][cstart]>=x)
	while((p1<=u1)&&(viz[ldest][cdest]==0)){
		w=v[0][p1];
		q=v[1][p1];
		for(k=0;k<=3;k++)
		   if(a[w+dl[k]][q+dc[k]]>=x&&viz[w+dl[k]][q+dc[k]]==0){
			   if(w+dl[k]>0&&q+dc[k]>0&&q+dc[k]<=n&&w+dl[k]<=m){
			   u1++;			   
			   v[0][u1]=w+dl[k];			   
			   v[1][u1]=q+dc[k];
			   viz[w+dl[k]][q+dc[k]]=1;}
		   }
	p1++;
	}
}


void dragoni(){
	for(k=1;k<=d;k++)
	{ i=dragon[0][k];
	  j=dragon[1][k];
	  u=1;p=1;
	  v[0][1]=i;
	  v[1][1]=j;
	  while(p<=u){
		q=v[0][p];
		w=v[1][p];
		for(x=0;x<=3;x++)
		   if(a[q][w]+1<a[q+dl[x]][w+dc[x]])
			   {a[q+dl[x]][w+dc[x]]=a[q][w]+1;
			u++;
				v[0][u]=q+dl[x];
				v[1][u]=w+dc[x];
			   }
		p++;

	  }
	}
}
void cauta(){
	min=2000000000;
	p=0;
	u=n*m;
	while(p<=u){
	 y=(p+u)/2;
	 verifica(y);
	 if(viz[ldest][cdest]!=0)
		{ min=y;
		  p=y+1;
		}
	else u=y-1;
	}
}
int main(){
f>>m>>n;
for(i=1;i<=m;i++){
	f.get();
	for(j=1;j<=n;j++)
	{ c=f.get();
	  if(c=='.')
		  a[i][j]=2000000000;
	   else if(c=='I'){
		   viz[i][j]=1;
		   a[i][j]=2000000000;
		    lstart=i;
			cstart=j;
	   }
	   else if(c=='O'){
		      a[i][j]=2000000000;
			  ldest=i;
			  cdest=j;
	   }
	   else if(c=='*'){
		    a[i][j]=-1;
	   }
	   else { d++;
	    dragon[0][d]=i;
	   dragon[1][d]=j;
	    a[i][j]=0;}
	}
}
dragoni();
cauta();
if(min==2000000000)
	g<<-1;
else g<<min;
return 0;
}