Pagini recente » Cod sursa (job #2380160) | Cod sursa (job #15893) | Cod sursa (job #2302745) | Cod sursa (job #1659368) | Cod sursa (job #1460599)
#include <fstream>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,startx,starty,stopx,stopy;
int d[1005][1005];
char a[1005][1005];
void Read()
{
int i,j;
char c;
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>c;
a[i][j] = c;
if(c=='I')
{
startx = i;
starty = j;
}
else if(c=='O')
{
stopx = i;
stopy = j;
}
}
}
bool OK(int i, int j)
{
if(i>n || j>m || i<1 || j<1) return false;
return true;
}
void Marcheaza(int D)
{
int i,j,x1,x2,y1,y2,cnt,y;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) d[i][j] = 0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]=='D')
{
d[i][j] = 1;
x1 = max(i-D,1);
x2 = min(i+D,n);
for(x1;x1<=x2;x1++)
d[x1][j] = 1;
y1 = max(1,j-D);
y2 = min(j+D,m);
for(y1;y1<=y2;y1++) d[i][y1] = 1;
x2 = max(i-D,1);
cnt = D-1;
for(x1 = i-1; x1 > x2; x1--)
{
for(y=j+1;y<=j+cnt && y<=m ;y++) d[x1][y] = 1;
for(y=j-1;y>=j-cnt && y>=1 ;y--) d[x1][y] = 1;
cnt--;
}
x2 = min(i+D,n);
cnt = D-1;
for(x1 = i+1; x1 < x2; x1++)
{
for(y=j+1;y<=j+cnt && y<=m ;y++) d[x1][y] = 1;
for(y=j-1;y>=j-cnt && y>=1 ;y--) d[x1][y] = 1;
cnt--;
}
}
else if(a[i][j]=='*') d[i][j] = 1;
}
void Fill(int i, int j)
{
d[i][j] = 2;
if(d[i+1][j]==0 && i<n)
Fill(i+1,j);
if(d[i-1][j]==0 && i>1)
Fill(i-1,j);
if(d[i][j+1]==0 && j<m)
Fill(i,j+1);
if(d[i][j-1]==0 && j>1)
Fill(i,j-1);
}
bool Check()
{
if(d[startx][starty]==0)
Fill(startx,starty);
if(d[stopx][stopy]==2) return true;
return false;
}
int main()
{
int st,dr,m,sol;
Read();
st = 0;
dr = n+m;
while(st<=dr)
{
m = (st+dr)/2;
Marcheaza(m);
if(Check()==true)
{
sol = m;
st = m+1;
}
else dr = m-1;
}
fout<<sol+1<<"\n";
fout.close();
return 0;
}