Pagini recente » Cod sursa (job #1264228) | Cod sursa (job #382882) | Cod sursa (job #2913815) | Cod sursa (job #1857008) | Cod sursa (job #3266220)
#include <bits/stdc++.h>
using namespace std;
bool z[1005][1005];
int l[1005][1005];
int ll[15],cc[15];
deque <int> qi;
deque <int> qj;
int g[1005][1005];
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n,m,ax,ay,bx,by;
cin>>n>>m;
char cr;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
l[i][j]=INT_MAX;
cin>>cr;
if(cr=='*')
{
z[i][j]=1;
}
else if(cr=='I')
{
ax=i;
ay=j;
}
else if(cr=='O')
{
bx=i;
by=j;
}
else if(cr=='D')
{
qi.push_back(i);
qj.push_back(j);
l[i][j]=0;
}
}
}
ll[1]=-1;
ll[2]=0;
ll[3]=0;
ll[4]=1;
cc[1]=0;
cc[2]=-1;
cc[3]=1;
cc[4]=0;
while(qi.size())
{
for(int h=1;h<=4;++h)
{
int ii,jj;
ii=qi.front()+ll[h];
jj=qj.front()+cc[h];
if(ii>=1 && ii<=n && jj>=1 && jj<=m && (l[qi.front()][qj.front()]+1)<l[ii][jj] && z[ii][jj]==0)
{
l[ii][jj]=(l[qi.front()][qj.front()]+1);
qi.push_back(ii);
qj.push_back(jj);
}
}
qi.pop_front();
qj.pop_front();
}
int st=0,dr=1005*1005,mij,in=-1,cnt=0;
while(st<=dr)
{
mij=(st+dr)/2;
++cnt;
if(mij<=l[ax][ay])
{
qi.push_back(ax);
qj.push_back(ay);
g[ax][ay]=cnt;
while(qi.size())
{
for(int h=1;h<=4;++h)
{
int ii,jj;
ii=qi.front()+ll[h];
jj=qj.front()+cc[h];
if(ii>=1 && ii<=n && jj>=1 && jj<=m && mij<=l[ii][jj] && g[ii][jj]!=cnt && z[ii][jj]==0)
{
g[ii][jj]=cnt;
qi.push_back(ii);
qj.push_back(jj);
}
}
qi.pop_front();
qj.pop_front();
}
}
if(g[bx][by]!=cnt)
{
dr=mij-1;
}
else
{
st=mij+1;
in=mij;
}
}
cout<<in;
return 0;
}