Pagini recente » Cod sursa (job #716497) | Cod sursa (job #2835486) | Cod sursa (job #2007311) | Cod sursa (job #1000757) | Cod sursa (job #1542396)
#include <bits/stdc++.h>
#define pb push_back
#define maxN 1002
using namespace std;
int n, m, d[maxN][maxN], pi, pj, oi, oj;
char a[maxN][maxN];
bool vis[maxN][maxN];
struct coord
{
int x, y;
}e;
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
int okc(int x, int y)
{
return (x >= 1 && y >= 1 && x <= n && y <= m && d[x][y] != -1);
}
deque < coord > q;
void read()
{
int i, j;
freopen("barbar.in", "r", stdin);
scanf("%d %d\n", &n, &m);
int inf = m * n + 1;
for (i = 1; i <= n; ++ i)
{
gets(a[i] + 1);
for (j = 1; j <= m; ++ j)
{
if (a[i][j] == 'O')
oi = i, oj = j;
if (a[i][j] == 'I')
pi = i, pj = j;
d[i][j] = inf;
if (a[i][j] == '*')
d[i][j] = -1;
if (a[i][j] == 'D')
{
d[i][j] = 0;
e.x = i; e.y = j;
q.push_back(e);
}
}
}
}
void solve()
{
int i, j;
coord node;
while (!q.empty())
{
node = q.front();
q.pop_front();
for (int k = 0; k < 4; ++ k)
if (okc(node.x + dx[k], node.y + dy[k]) && d[node.x + dx[k]][node.y + dy[k]] > d[node.x][node.y] + 1)
{
d[node.x + dx[k]][node.y + dy[k]] = d[node.x][node.y] + 1;
e.x = node.x + dx[k]; e.y = node.y + dy[k];
q.push_back(e);
}
}
}
int ok(int x)
{
memset(vis, 0, sizeof(vis));
vis[pi][pj] = 1;
q.clear();
e.x = pi; e.y = pj;
q.push_back(e);
coord node;
vis[pi][pj] = 1;
while (!q.empty())
{
node = q.front();
q.pop_front();
for (int k = 0; k < 4; ++ k)
if (okc(node.x + dx[k], node.y + dy[k]) && d[node.x + dx[k]][node.y + dy[k]] >= x && !vis[node.x + dx[k]][node.y + dy[k]])
{
e.x = node.x + dx[k]; e.y = node.y + dy[k];
vis[node.x + dx[k]][node.y + dy[k]] = 1;
q.push_back(e);
}
}
return vis[oi][oj] && d[oi][oj] >= x;
}
int bs()
{
int i = -1, p = 1 << 20;
while (p)
{
if (i + p < m * n && ok(i + p))
i += p;
p /= 2;
}
return i;
}
void write()
{
freopen("barbar.out", "w", stdout);
printf("%d", bs());
}
int main()
{
read();
solve();
write();
return 0;
}