Pagini recente » Cod sursa (job #2871556) | Cod sursa (job #1435212) | Cod sursa (job #2066121) | Cod sursa (job #3216133) | Cod sursa (job #1600420)
#include <bits/stdc++.h>
#define Dim 1002
FILE *fin = freopen("barbar.in", "r", stdin);
FILE *fout = freopen("barbar.out", "w", stdout);
using namespace std;
int n, m, Sol, M[Dim][Dim];
bool vis[Dim][Dim];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
char C[Dim][Dim];
struct nod
{
int x;
int y;
int d;
}xi, xf, xx, yy;
deque <nod> Q;
void read()
{
scanf("%d %d\n", &n, &m);
for(int i = 1; i <= n; ++ i)
gets(C[i] + 1);
}
void bord()
{
int i;
for(i = 0; i <= n + 1; ++ i)
M[i][0] = M[i][m + 1] = -1;
for(i = 0; i <= m + 1; ++ i)
M[0][i] = M[n + 1][i] = -1;
}
void asf()
{
int i, j;
for (i = 0; i <= n + 1; ++ i)
{
for (j = 0; j <= m + 1; ++ j)
printf("%d ", M[i][j]);
printf("\n");
}
}
void dist()
{
while(!Q.empty())
{
xx = Q.front();
Q.pop_front();
for(int k = 0; k < 4; ++ k)
{
yy.x = xx.x + dx[k];
yy.y = xx.y + dy[k];
yy.d = xx.d + 1;
if(M[yy.x][yy.y] > yy.d)
{
M[yy.x][yy.y] = yy.d;
Q.push_back(yy);
}
}
}
//asf();
}
bool way(int dist)
{
Q.clear();
Q.push_back(xi);
memset(vis, 0, sizeof(vis));
while(!Q.empty())
{
xx = Q.front();
Q.pop_front();
for(int k = 0; k < 4; ++ k)
{
yy.x = xx.x + dx[k];
yy.y = xx.y + dy[k];
if(M[yy.x][yy.y] >= dist && M[yy.x][yy.y] != Dim * Dim && !vis[yy.x][yy.y])
{
if(yy.x == xf.x && yy.y == xf.y)
return 1;
Q.push_back(yy);
vis[yy.x][yy.y] = 1;
}
}
}
return 0;
}
int bsearch()
{
int i = 0, p = 1 << 20;
while(p)
{
if(i + p < Dim * Dim && way(i + p))
i += p;
p /= 2;
}
return i;
}
void solve()
{
int i, j;
for(i = 1; i <= n; ++ i)
for(j = 1; j <= m; ++ j)
{
if(C[i][j] == 'D')
{
xx.x = i;
xx.y = j;
xx.d = 0;
Q.push_back(xx);
}
if(C[i][j] == '*')
M[i][j] = -1;
if(C[i][j] == 'I')
xi.x = i, xi.y = j, M[i][j] = Dim * Dim;
if(C[i][j] == 'O')
xf.x = i, xf.y = j, M[i][j] = Dim * Dim;
if(C[i][j] == '.')
M[i][j] = Dim * Dim;
}
dist();
Sol = bsearch();
}
void write()
{
if(!Sol)
printf("-1\n");
else printf("%d\n", Sol);
}
int main()
{
read();
bord();
solve();
write();
return 0;
}