Pagini recente » Cod sursa (job #2238294) | Cod sursa (job #2687053) | Cod sursa (job #3143556) | Cod sursa (job #2138895) | Cod sursa (job #1327319)
#include <fstream>
#include <string.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int OK,n,m,l1,l2,c1,c2,a[1001][1001],dx[]={1,0,-1,0},dy[]={0,1,0,-1},q[2][1000002],sol=-1;
bool d[1001][1001];
char ch;
void coada1(int nr)
{
int x,y,l,c,p=1,u=1;
OK=0;
memset(d,0,sizeof(d));
while(p<=u&&OK==0)
{
x=q[0][p];
y=q[1][p];
for(int i=0;i<4;i++)
{
l=x+dx[i];
c=y+dy[i];
if(a[l][c]>=nr&&d[l][c]==0&&l>0&&c>0&&l<=n&&c<=m)
{
d[l][c]=1;
q[0][++u]=l;
q[1][u]=c;
if(l==l2&&c==c2)
OK=1;
}
}
p++;
}
}
void coada(int p, int u)
{
int x,y,l,c;
while(p<=u)
{
x=q[0][p];
y=q[1][p];
for(int i=0;i<4;i++)
{
l=x+dx[i];
c=y+dy[i];
if(a[l][c]==0&&d[l][c]==0&&l>0&&c>0&&l<=n&&c<=m)
{
a[l][c]=a[x][y]+1;
q[0][++u]=l;
q[1][u]=c;
}
}
p++;
}
}
int bin(int st, int dr)
{
int mij;
while(st<=dr)
{
mij=(st+dr)/2;
coada1(mij);
if(OK==1)
{
st=mij+1;
sol=max(sol,mij);
}
else
dr=mij-1;
}
return sol;
}
int main()
{
int p=1,u=1;
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
fin>>ch;
if(ch=='.')
a[i][j]=0;
else
if(ch=='*')
a[i][j]=-1;
else
if(ch=='D')
{
d[i][j]=1;
q[0][++u]=i;
q[1][u]=j;
}
else
if(ch=='I')
{
l1=i;
c1=j;
}
else
{
l2=i;
c2=j;
}
}
coada(p,u);
q[0][1]=l1;
q[1][1]=c1;
memset(d,0,sizeof(d));
fout<<bin(1,max(n,m));
return 0;
}