Pagini recente » Cod sursa (job #1932421) | Cod sursa (job #1931307) | Cod sursa (job #2219146) | Cod sursa (job #2975836) | Cod sursa (job #2162862)
#include <bits/stdc++.h>
#define iKo 9999999
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
int n,xs,ys,m,a[1005][1005],b[1005][1005],c[1005][1005],xos,yos;
queue< pair<int,int> > q;
int dx[]={-1,1,0, 0};
int dy[]={ 0,0,1,-1};
void Read()
{
char ch;
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
b[i][j]=iKo;
fin>>ch;
if(ch=='.') a[i][j]=0;
else if(ch=='I') {xs=i;ys=j;}
else if(ch=='*') a[i][j]=-1;
else if(ch=='D') {q.push({i,j});b[i][j]=0;}
else if(ch=='O') {xos=i;yos=j;}
}
}
void Bord()
{
for(int i=0;i<=n+1;i++)
a[i][0]=a[i][m+1]=-1;
for(int i=0;i<=m+1;i++)
a[0][i]=a[n+1][i]=-1;
}
void LeeD()
{
int i,j,x,y;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(int k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
if(a[x][y]!=-1&&b[x][y]>b[i][j]+1)
{
b[x][y]=b[i][j]+1;
q.push({x,y});
}
}
}
}
void Init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
c[i][j]=iKo;
}
int LeeB(int s)
{
Init();
int i,j,x,y,k;
if(c[xs][ys]<s) return 0;
q.push({xs,ys});
c[xs][ys]=0;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(k=0;k<4;k++)
{
x=i+dx[k];
y=j+dy[k];
if(a[x][y] != -1 && c[x][y] > c[i][j] + 1 && b[x][y] >= s)
{
c[x][y]=c[i][j]+1;
q.push({x,y});
}
}
}
if(c[xos][yos]==iKo) return 0;
return 1;
}
void BinSearch()
{
int st=0,dr = iKo,mij,ans=-1;
while(st<=dr)
{
mij=(st+dr)/2;
if(LeeB(mij)==1)
{
ans=mij;
st=mij+1;
}
else
dr=mij-1;
}
fout<<ans<<"\n";
}
int main()
{
Read();
Bord();
LeeD();
BinSearch();
return 0;
}