Cod sursa(job #362963)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 11 noiembrie 2009 13:43:56
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include<stdio.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,lstart,cstart,ldest,cdest,i,j,d,min,v[2][1000001];
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){
	int u1,p1,k,w,q;
	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;
			   if(v[0][u1]==ldest&&v[1][u1]==cdest)
			       break;
			   }
		   
	p1++;
	}
}


void dragoni(){
 int i,j,k,u,p,q,w,x;
 curata();
 u=0;
 for(k=1;k<=d;k++)
 { i=dragon[0][k];
   j=dragon[1][k];
   viz[i][j]=k;
    v[0][k]=i;
   v[1][k]=j;
   } 
   p=1;u=d;
    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;
         if(viz[q+dl[x]][w+dc[x]]==0||(viz[q+dl[x]][w+dc[x]]!=0&&p>=viz[q+dl[x]][w+dc[x]])){
       u++;
       viz[q+dl[x]][w+dc[x]]=u;
       v[0][u]=q+dl[x];
       v[1][u]=w+dc[x];
      }
      }
  p++;
   
   }
 }


void cauta(){
	int y,p,u;
	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(){
	FILE *f,*g;
	f=fopen("barbar.in","r");
	g=fopen("barbar.out","w");
fscanf(f,"%d %d",&m,&n);
for(i=1;i<=m;i++){
	fgetc(f);
	for(j=1;j<=n;j++)
	{ c=fgetc(f);
	  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)
	fprintf(g,"%d",-1);
else fprintf(g,"%d",min);
return 0;
}