Pagini recente » Cod sursa (job #67671) | Cod sursa (job #535919) | Cod sursa (job #2749847) | Cod sursa (job #2862018) | Cod sursa (job #2335690)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j,u,st,dr,mij,sol,li,ci;
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
int v[1005][1005],d[1005][1005];
bool viz[1005][1005];
char c;
struct numar{
int l,c;
}q[1000100];
void dragoni(){
int p=1,r,l,c,lnou,cnou;
while(p<=u){
l=q[p].l;
c=q[p].c;
for(r=1;r<=4;r++){
lnou=l+dx[r];
cnou=c+dy[r];
if(v[lnou][cnou]>0){
if(viz[lnou][cnou]==0){
viz[lnou][cnou]=1;
q[++u].l=lnou;
q[u].c=cnou;
d[lnou][cnou]=d[l][c]+1;
}
else if(d[lnou][cnou]>d[l][c]+1){
d[lnou][cnou]=d[l][c]+1;
q[++u].l=lnou;
q[u].c=cnou;
}
}
}
p++;
}
}
int coada(int D){
if(d[li][ci]<D)
return 0;
int p,u,r,l,c,lnou,cnou;
memset(viz,0,sizeof(viz));
p=u=1;
q[p].l=li;
q[p].c=ci;
viz[li][ci]=1;
while(p<=u){
l=q[p].l;
c=q[p].c;
for(r=1;r<=4;r++){
lnou=l+dx[r];
cnou=c+dy[r];
if(v[lnou][cnou]>0 && viz[lnou][cnou]==0 && d[lnou][cnou]>=D){
q[++u].l=lnou;
q[u].c=cnou;
viz[lnou][cnou]=1;
if(v[lnou][cnou]==3)
return 1;
}
}
p++;
}
return 0;
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
fin>>c;
if(c=='.')
v[i][j]=1;
else if(c=='I'){
v[i][j]=2;
li=i; ci=j;
}
else if(c=='O')
v[i][j]=3;
else if(c=='D'){
q[++u].l=i;
q[u].c=j;
}
}
dragoni();
st=1; dr=1000000;
sol=-1;
while(st<=dr){
mij=(st+dr)/2;
if(coada(mij)==1){
sol=mij;
st=mij+1;
}
else
dr=mij-1;
}
fout<<sol;
return 0;
}