Pagini recente » Cod sursa (job #1961295) | Cod sursa (job #2457216) | Cod sursa (job #2146387) | Cod sursa (job #2600536) | Cod sursa (job #2575040)
#include <bits/stdc++.h>
#define NMAX 1005
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
vector < int > cdx,cdy,drgx,drgy;
int dragoni,n,m,rasp=-1,xs,ys,xu,yu,u,st,dr,mij,distmin,x,y,p,z;
int lee[NMAX][NMAX];
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
bool aux[NMAX][NMAX];
char v[NMAX][NMAX];
void bordare()
{
for(int i=0;i<=n+1;i++)
lee[i][0]=lee[i][m+1]=-1;
for(int i=0;i<=m+1;i++)
lee[0][i]=lee[n+1][i]=-1;
}
void citire()
{
fin>>n>>m;
char car;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
fin>>car;
v[i][j]=car;
if(car=='D')
{
drgx.push_back(i);
drgy.push_back(j);
dragoni++;
aux[i][j]=1;
}
else if(car=='*')aux[i][j]=1;
else if(car=='I')
{
xs=i;
ys=j;
}
else if(car=='O')
{
xu=i;
yu=j;
}
}
}
bordare();
}
void refresh()
{
cdx.clear();
cdy.clear();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
lee[i][j]=0;
}
}
}
bool inside(int x,int y)
{
if(x>=1&&x<=n&&y>=1&&y<=m)return 1;
return 0;
}
void fill(int x,int y)
{
cdx.push_back(x);
cdy.push_back(y);
p=u=0;
while(p<=u)
{
x=cdx[p];
y=cdy[p];
z=lee[x][y];
if(-z<mij)
{
for(int i=0;i<4;i++)
{
int xf=x+dx[i];
int yf=y+dy[i];
if(aux[xf][yf]==0&&lee[xf][yf]==0)
{
cdx.push_back(xf);
cdy.push_back(yf);
lee[xf][yf]=z-1;
u++;
}
}
}
p++;
}
cdx.clear();
cdy.clear();
}
void marcare()
{
for(int i=0;i<dragoni;i++)
{
lee[drgx[i]][drgy[i]]=-1;
fill(drgx[i],drgy[i]);
}
}
void alglee()
{
cdx.push_back(xs);
cdy.push_back(ys);
p=u=0;
while(p<=u)
{
x=cdx[p];
y=cdy[p];
z=lee[x][y];
for(int i=0;i<4;i++)
{
int xf=x+dx[i];
int yf=y+dy[i];
if(aux[xf][yf]==0&&lee[xf][yf]==0)
{
cdx.push_back(xf);
cdy.push_back(yf);
lee[xf][yf]=z+1;
u++;
}
}
p++;
}
}
void solve()
{
st=0;
dr=distmin;
while(st<=dr)
{
mij=(st+dr)/2;
marcare();
alglee();
if(lee[xu][yu]>0)
{
rasp=mij;
st=mij+1;
}
else dr=mij-1;
refresh();
}
}
int main()
{
citire();
cdx.push_back(xs);
cdy.push_back(ys);
while(p<=u&&!distmin)
{
x=cdx[p];
y=cdy[p];
z=lee[x][y];
for(int i=0;i<4;i++)
{
int xf=x+dx[i];
int yf=y+dy[i];
if(aux[xf][yf]==0&&lee[xf][yf]==0)
{
cdx.push_back(xf);
cdy.push_back(yf);
lee[xf][yf]=z+1;
u++;
}
else if(v[xf][yf]=='D')
{
distmin=z+1;
break;
}
}
p++;
}
refresh();
solve();
if(rasp==-1)fout<<-1;
else fout<<rasp;
}