Pagini recente » Cod sursa (job #2440117) | Cod sursa (job #2517018) | Cod sursa (job #1327030) | Cod sursa (job #2732217) | Cod sursa (job #483159)
Cod sursa(job #483159)
#include<fstream.h>
#include<vector>
#include<queue>
#define NMAX 1000005
using namespace std;
long dl[4]={-1,0,1,0};
long dc[4]={0,1,0,-1};
vector<long> a[NMAX],d(NMAX,NMAX);
char C[1002][1002];
char drg[NMAX];
queue<long> q;
vector<bool> v;
long r,c,n,ns,nf,cd[NMAX],ls,cs,lf,cf;
void cit()
{ifstream fin("barbar.in");
fin>>r>>c;
long i,j;
for(i=1;i<=r;++i)
for(j=1;j<=c;++j)
fin>>C[i][j];
fin.close();
}
void firstbfs()
{long i,k;
v.reserve(n+2);
for(i=1;i<=n;++i)
v[i]=false;
for(i=1;i<=n;++i)
if(drg[i]==1)
q.push(i),v[i]=true,d[i]=0;
while(!q.empty())
{k=q.front();
for(i=0;i<a[k].size();++i)
if(v[a[k][i]]==false&&d[a[k][i]]>d[k]+1)
{v[a[k][i]]=true;
d[a[k][i]]=d[k]+1;
q.push(a[k][i]);
}
q.pop();
}
}
long bfs(long p)
{long i,k,j,sw=0,l,cl;
cd[0]=0;
if(d[ns]>=p)
cd[++cd[0]]=ns;
for(i=1;i<=n;++i)
v[i]=false;
v[ns]=true;
for(j=1;j<=cd[0];++j)
{k=cd[j];
for(i=0;i<a[k].size();++i)
if(!v[a[k][i]]&&d[a[k][i]]>=p)
{cd[++cd[0]]=a[k][i];
v[a[k][i]]=true;
if(a[k][i]==nf)
{return 1;
}
}
}
return 0;
}
long cauta(long p,long u)
{long m=(p+u)/2;
if(p<=u)
{
if(bfs(m))
return cauta(m+1,u);
else
return cauta(p,m-1);
}
else
if(p>u)
return p-1;
}
void afis()
{ofstream fout("barbar.out");
long k=cauta(1,n);
if(k==0&&bfs(0)==0)
fout<<-1<<'\n';
else
fout<<k<<'\n';
fout.close();
}
int main()
{cit();
long i,j,k,ni,nj;
for(i=1;i<=r;++i)
for(j=1;j<=c;++j)
if(C[i][j]=='I')
{C[i][j]='.';ls=i;cs=j;}
else
if(C[i][j]=='O')
{C[i][j]='.';lf=i;cf=j;}
for(i=1;i<=r;++i)
for(j=1;j<=c;++j)
{++n;
drg[n]=2;
if(C[i][j]=='D')
drg[n]=1;
if(C[i][j]=='.')
drg[n]=0;
for(k=0;k<=3;++k)
{ni=i+dl[k];
nj=j+dc[k];
if(ni>=1&&ni<=r&&nj>=1&&nj<=c&&C[i][j]!='*'&&C[ni][nj]!='*')
a[n].push_back((ni-1)*c+nj);
}
}
ns=(ls-1)*c+cs;
nf=(lf-1)*c+cf;
firstbfs();
afis();
return 0;
}