Pagini recente » Cod sursa (job #2196647) | Cod sursa (job #818805) | Cod sursa (job #173526) | Cod sursa (job #966330) | Cod sursa (job #2031472)
#include<fstream>
#include<iostream>
#include<queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,d[1005][1005],v[1005][1005],r[1005][1005],a,b,fl,fc,f,nr=3,mi,ma;
char x[1005][1005];
queue<pair<int,int> >q;
int dl[4]={0,0,1,-1};
int dc[4]={1,-1,0,0};
int te(int x)
{
if(x<0)
return 0;
return x;
}
void bfs1()
{
int l,c,lnou,cnou;
while(!q.empty())
{
l=q.front().first;
c=q.front().second;
q.pop();
for(int de=0;de<4;de++)
{
lnou=l+dl[de];
cnou=c+dc[de];
if(lnou>=1&&cnou>=1&&lnou<=n&&cnou<=m)
if(x[lnou][cnou]=='.')
if(!v[lnou][cnou]||d[l][c]+1<d[lnou][cnou])
{
d[lnou][cnou]=d[l][c]+1;
v[lnou][cnou]=1;
q.push(make_pair(lnou,cnou));
}
}
}
}
void vef()
{
int l,c,lnou,cnou;
while(!q.empty())
{
l=q.front().first;
c=q.front().second;
q.pop();
for(int de=0;de<4;de++)
{
lnou=l+dl[de];
cnou=c+dc[de];
if(lnou>=1&&cnou>=1&&lnou<=n&&cnou<=m)
if(x[lnou][cnou]=='.'||x[lnou][cnou]=='O')
if(v[lnou][cnou]!=2)
{
v[lnou][cnou]=2;
q.push(make_pair(lnou,cnou));
}
}
}
}
void bfs2()
{
int l,c,lnou,cnou;
while(!q.empty())
{
l=q.front().first;
c=q.front().second;
q.pop();
for(int de=0;de<4;de++)
{
lnou=l+dl[de];
cnou=c+dc[de];
if(lnou>=1&&cnou>=1&&lnou<=n&&cnou<=m)
if(x[lnou][cnou]!='*')
if((v[lnou][cnou]!=nr||r[l][c]+d[lnou][cnou]-f<r[lnou][cnou])&&d[lnou][cnou]-f>=0)
{
r[lnou][cnou]=r[l][c]+d[lnou][cnou]-f;
v[lnou][cnou]=nr;
q.push(make_pair(lnou,cnou));
}
}
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
fin>>x[i][j];
if(x[i][j]=='I')
{
a=i;
b=j;
}
if(x[i][j]=='O')
{
fl=i;
fc=j;
}
if(x[i][j]=='D')
{
q.push(make_pair(i,j));
v[i][j]=1;
}
}
bfs1();
v[a][b]=2;
q.push(make_pair(a,b));
vef();
if(v[fl][fc]!=2)
{
fout<<-1;
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
mi=min(mi,d[i][j]);
ma=max(ma,d[i][j]);
}
int st=mi,dr=ma;
while(st<dr)
{
f=(st+dr+1)/2;
nr++;
v[a][b]=nr;
r[a][b]=0;
r[fl][fc]=-1;
d[fl][fc]=f;
q.push(make_pair(a,b));
bfs2();
//cout<<f<<' '<<r[fl][fc]<<'\n';
if(r[fl][fc]<0)
dr=f-1;
else
st=f;
}
fout<<st;
/* for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cout<<d[i][j]<<' ';
cout<<'\n';
}*/
}