Cod sursa(job #478694)
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
typedef struct{int x,y;} matrice;
matrice start,stop;
std::queue<matrice>c;
bool ok;
int dragon[1005][1005],n,m,maxim,viz[1005][1005];
char a[1005][1005];
const int dx[]={-1,1,0,0}, dy[]={0,0,1,-1};
void bfs(void)
{
int i,j,d;
matrice elem;
while(!c.empty())
{
elem=c.front();
c.pop();
i=elem.x; j=elem.y;
for(d=0;d<4;d++)
if((!dragon[i+dx[d]][j+dy[d]]) && (a[i+dx[d]][j+dy[d]]=='.')) { dragon[i+dx[d]][j+dy[d]]=dragon[i][j]+1; elem.x=i+dx[d]; elem.y=j+dy[d]; c.push(elem);}
}
}
int bf(int dist)
{
int i,j,d;
matrice nod,elem;
memset(viz,0,sizeof(viz));
c=std::queue<matrice>();
if(dragon[start.x][start.y]<dist) return 0;
c.push(start);
viz[start.x][start.y]=1;
while(!c.empty())
{
nod=c.front();
i=nod.x; j=nod.y;
c.pop();
for(d=0;d<4;d++)
if((dragon[i+dx[d]][j+dy[d]]>=dist) && (a[i+dx[d]][j+dy[d]]=='.' or a[i+dx[d]][j+dy[d]]=='D') && (!viz[i+dx[d]][j+dy[d]])) {viz[i+dx[d]][j+dy[d]]=1; elem.x=i+dx[d]; elem.y=j+dy[d]; c.push(elem); if(elem.x==stop.x && elem.y==stop.y) break;}
}
if(viz[stop.x][stop.y]==1) return 1; else return 0;
}
int main()
{
int i,j;
matrice el;
int dr,st,mij;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
fi>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fi>>a[i][j];
if(a[i][j]=='I') { start.x=i; start.y=j; a[i][j]='.';}
if(a[i][j]=='O') {stop.x=i; stop.y=j; a[i][j]='.';}
if(a[i][j]=='D') el.x=i,el.y=j, c.push(el);
}
bfs();
st=0; dr=n*m;
while (dr-st>1)
{
mij=(st+dr)>>1;
if (bf(mij)) st=mij;
else dr=mij;
}
if(st) fo<<st<<"\n";
else if(bf(0)) fo<<"0\n"; else fo<<"-1\n";
fo.close();
return 0;
}