Cod sursa(job #362710)

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