Pagini recente » Cod sursa (job #1015087) | Cod sursa (job #318076) | Monitorul de evaluare | hc_round_9 | Cod sursa (job #362956)
Cod sursa(job #362956)
#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,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 k,i,j,u,p,q,w,x;
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]])
if(w+dc[x]>0&&q+dl[x]>0&&q+dl[x]<=m&&w+dc[x]<=n)
{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(){
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(){
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;
}