Pagini recente » Cod sursa (job #161996) | Cod sursa (job #605888) | Cod sursa (job #142164) | Cod sursa (job #1079365) | Cod sursa (job #2349946)
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,ls,cs,lf,cf,sol,nrd;
char c;
int dx[]={0,1,0,-1,0},dy[]={0,0,1,0,-1};
struct dragoni
{
int l,c;
}v[100001];
struct coada
{
int l,c;
}q[1000001];
int a[1001][1001],d[1001][1001];
bool drum[1001][1001];
bool inrange(int x, int y)
{
return x>0&&x<=n&&y>0&&y<=m;
}
bool coada(int range)
{
memset(drum,0,sizeof(drum));
memset(d,0,sizeof(d));
for(int i=1;i<=nrd;i++)
{
int st=1,dr=1;
q[st].l=v[i].l;
q[st].c=v[i].c;
d[q[st].l][q[st].c]=1;
while(st<=dr)
{
int l=q[st].l;
int c=q[st].c;
for(int k=1;k<=4;k++)
{
int ln=l+dx[k];
int cn=c+dy[k];
if(inrange(ln,cn)&&a[ln][cn]!=1)
{
if((d[ln][cn]==0||d[ln][cn]>d[l][c]+1)&&d[l][c]+1<range)
{
d[ln][cn]=d[l][c]+1;
dr++;
q[dr].l=ln;
q[dr].c=cn;
}
}
}
st++;
}
}
if(d[ls][cs]==1)
return 0;
int st=1,dr=1;
q[1].l=ls;q[1].c=cs;
drum[ls][cs]=1;
while(st<=dr)
{
int l=q[st].l;
int c=q[st].c;
for(int k=1;k<=4;k++)
{
int ln=l+dx[k];
int cn=c+dy[k];
if(inrange(ln,cn))
{
if(d[ln][cn]==0&&a[ln][cn]==0&&drum[ln][cn]==0)
{
if(ln==lf&&cn==cf)
return 1;
drum[ln][cn]=1;
dr++;
q[dr].l=ln;
q[dr].c=cn;
}
}
}
st++;
}
return 0;
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
fin>>c;
if(c=='I')
ls=i,cs=j;
else if(c=='O')
lf=i,cf=j;
else if(c=='*')
a[i][j]=1;
else if(c=='D')
{
nrd++;
v[nrd].l=i;
v[nrd].c=j;
a[i][j]=2;
}
}
int st=0,dr=1000;
while(st<=dr)
{
int mid=(st+dr)/2;
int dist=coada(mid);
if(dist==1)
{
sol=mid;
st=mid+1;
}
else
dr=mid-1;
}
fout<<sol-1;
return 0;
}