Pagini recente » Cod sursa (job #110863) | Cod sursa (job #2947404) | Cod sursa (job #2326847) | Cod sursa (job #2983047) | Cod sursa (job #2349896)
#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],drum[1001][1001];
bool inrange(int x, int y)
{
return x>0&&x<=n&&y>0&&y<=m;
}
bool ok;
int 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++;
}
}
ok=1;
int st=1;
int 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)
{
drum[ln][cn]=drum[l][c]+1;
dr++;
q[dr].l=ln;
q[dr].c=cn;
}
}
}
st++;
}
for(int ii=1;ii<=n;ii++)
{
for(int jj=1;jj<=m;jj++)
fout<<drum[ii][jj]<<' ';
fout<<'\n';
}
fout<<'\n';
return drum[lf][cf];
}
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=100000;
while(st<=dr)
{
int mid=(st+dr)/2;
int dist=coada(mid);
if(dist!=0)
{
sol=mid;
st=mid+1;
}
else
dr=mid-1;
}
fout<<sol-1;
return 0;
}