Pagini recente » Cod sursa (job #958207) | Cod sursa (job #2238816) | Cod sursa (job #2308755) | Cod sursa (job #2410936) | Cod sursa (job #1543283)
#include <fstream>
#include <string.h>
#define inf 1000000001
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
struct str
{
int l,c;
};
str cd[1000001],ip,fi;
int k,a[1005][1005],n,m,i,j,sol;
bool viz[1005][1005],ok;
char s[1005];
void formmat()
{
int ic=1;
int sc=k;
int pl,pc,noul,nouc;
for(ic=1;ic<=sc;ic++)
{
pl=cd[ic].l;
pc=cd[ic].c;
for(int i=0;i<=3;i++)
{
noul=pl+dx[i];
nouc=pc+dy[i];
if(a[noul][nouc]==inf)
{
a[noul][nouc]=a[pl][pc]+1;
sc++;
cd[sc].l=noul;cd[sc].c=nouc;
}
}
}
}
bool bf(int z)
{
if(a[ip.l][ip.c]<z)
return 0;
memset(viz,0,sizeof(viz));
cd[1].l=ip.l;
cd[1].c=ip.c;
int ic=1;
int sc=1;
int pl,pc;
viz[ip.l][ip.c]=1;
while(ic<=sc)
{
pl=cd[ic].l;
pc=cd[ic].c;
for(int i=0;i<=3;i++)
if(viz[pl+dx[i]][pc+dy[i]]==0&&a[pl+dx[i]][pc+dy[i]]>=z)
{
viz[pl+dx[i]][pc+dy[i]]=1;
cd[++sc].l=pl+dx[i];
cd[sc].c=pc+dy[i];
if(fi.l==pl+dx[i]&&fi.c==pc+dy[i])
return 1;
}
ic++;
}
return 0;
}
int main()
{
fin>>n>>m;
fin.get();
for(i=1;i<=n;i++)
{
memset(s,0,strlen(s));
fin.getline(s,m+1);
for(j=0;j<m;j++)
switch(s[j])
{
case '.':a[i][j+1]=inf;break;
case 'I':
a[i][j+1]=inf;
ip.l=i;
ip.c=j+1;
break;
case 'D':
cd[++k].l=i;
cd[k].c=j+1;
a[i][j+1]=0;
break;
case '*':a[i][j+1]=-1;break;
case 'O':
fi.l=i;
fi.c=j+1;
a[i][j+1]=inf;
break;
}
}
for(i=0;i<=m+1;i++)
{
a[0][i]=-1;
a[n+1][i]=-1;
}
for(i=0;i<=n+1;i++)
{
a[i][0]=-1;
a[i][m+1]=-1;
}
formmat();
int q=0,w=max(n,m);
sol=-1;
while(q<=w)
{
int mid=(q+w)/2;
ok=bf(mid);
if(ok==1)
{
sol=mid;
q=mid+1;
}
else
w=mid-1;
}
fout<<sol;
return 0;
}