Pagini recente » Cod sursa (job #1358508) | Cod sursa (job #2874509) | Cod sursa (job #2182013) | Cod sursa (job #1361862) | Cod sursa (job #2092041)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct poz
{
int l, c;
}start, stop;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
queue<poz>coada;
int nr[1002][1002], M[1002][1002];
int n, m, st, dr, mij;
char ch;
void lee()
{
poz p, q;
int lv, cv;
while(!coada.empty())
{
p=coada.front();
coada.pop();
for(int d=0; d<4; ++d)
{
lv=p.l+dx[d];
cv=p.c+dy[d];
if(lv>0 && lv<=n && cv>0 && cv<=m)
{
if(nr[lv][cv]==0)
{
nr[lv][cv]=nr[p.l][p.c]+1;
q.l=lv; q.c=cv;
coada.push(q);
}
}
}
}
}
int main()
{
fin>>n>>m;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
fin>>ch;
if(ch=='*') nr[i][j]=-1;
else
{
if(ch=='I')
{
start.l=i;
start.c=j;
}
if(ch=='O')
{
stop.l=i;
stop.c=j;
}
if(ch=='D')
{
poz q;
q.l=i; q.c=j;
coada.push(q);
nr[i][j]=1;
}
}
}
}
lee();
/*for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j) fout<<nr[i][j]<<" ";
fout<<"\n";
}*/
st=1; dr=max(n, m);
bool sol=0;
while(st<=dr)
{
mij=(st+dr)/2;
while(!coada.empty()) coada.pop();
if(mij>nr[start.l][start.c])
{
dr=mij-1;
continue;
}
else
{
poz p, q;
int lv, cv;
coada.push(start);
M[start.l][start.c]=mij;
bool gasit=0;
while(!coada.empty() && !gasit)
{
p=coada.front();
coada.pop();
for(int d=0; d<4; ++d)
{
lv=p.l+dx[d];
cv=p.c+dy[d];
if(lv>0 && lv<=n && cv>0 && cv<=m)
{
if(nr[lv][cv]>=mij && M[lv][cv]!=mij)
{
M[lv][cv]=mij;
q.l=lv; q.c=cv;
if(lv==stop.l && cv==stop.c) gasit=1;
coada.push(q);
}
}
}
}
if(gasit)
{
st=mij+1;
sol=1;
}
else dr=mij-1;
}
}
if(sol) fout<<dr-1<<"\n";
else fout<<"-1";
return 0;
}