Pagini recente » Cod sursa (job #2329188) | Cod sursa (job #2112628) | Cod sursa (job #246138) | Cod sursa (job #2984460) | Cod sursa (job #1221998)
#include<fstream>
#include<queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
const int nmax=1005;
int n,m,viz[nmax][nmax],dmin[nmax][nmax];
queue<pair<int, int > > q;
int Ix,Iy,Ox,Oy;
int bfs(int x)
{
if (dmin[Ix][Iy]<x) return 0;
while(q.size()) q.pop();
q.push(make_pair(Ix,Iy));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) viz[i][j]=0;
viz[Ix][Iy]=1;
while (q.size()) {
for (int k=0;k<4;k++) {
int xx=q.front().first+dx[k],yy=q.front().second+dy[k];
if (xx>0&&xx<=n&&yy>0&&yy<=m) {
if (dmin[xx][yy]>=x && viz[xx][yy]==0) {
q.push(make_pair(xx,yy));
viz[xx][yy]=1;
}
}
}
q.pop();
}
return (viz[Ox][Oy]);
}
void Distmin()
{
while (!q.empty()) {
for (int i=0;i<4;i++) {
int xx=q.front().first+dx[i],yy=q.front().second+dy[i];
if (xx>0&&xx<=n&&yy>0&&yy<=m)
if (viz[xx][yy]==0)
{
viz[xx][yy]=1;
dmin[xx][yy]=dmin[q.front().first][q.front().second]+1;
q.push(make_pair(xx,yy));
}
}
q.pop();
}
}
void Read()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
char c;
cin>>c;
if (c=='*') dmin[i][j]=-1,viz[i][j]=1;
if (c=='I') Ix=i,Iy=j;
if (c=='O') Ox=i,Oy=j;
if (c=='D') viz[i][j]=1,q.push(make_pair(i,j));
}
}
int main()
{
Read();
Distmin();
int l=0,r=n*m,sol=-1;
while(l<=r) {
int mij=(l+r)/2;
if (bfs(mij)) sol=mij,l=mij+1;
else r=mij-1;
}
cout<<sol;
return 0;
}