Pagini recente » Cod sursa (job #482701) | Cod sursa (job #467672) | Cod sursa (job #2128860) | Cod sursa (job #544270) | Cod sursa (job #362710)
Cod sursa(job #362710)
#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;
}