Pagini recente » Cod sursa (job #2882957) | Cod sursa (job #778782) | Cod sursa (job #2608527) | Cod sursa (job #3222165) | Cod sursa (job #3238530)
#include <bits/stdc++.h>
using namespace std;
const int dy[] = {-1, 1, 0, 0}, dx[] = {0, 0, -1, 1};
char a[1005][1005];
int dist[1005][1005], visited[1005][1005], n, m;
bool inside(int y, int x)
{
return y >= 1 && y <= n && x >= 1 && x <= m;
}
int bfs(int ys, int xs, int yf, int xf, int value)
{
if (dist[ys][xs] < value || dist[yf][xf] < x)
return 0;
queue<pair<int,int>> q;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
visited[i][j] = 0;
q.push({ys, xs});
visited[ys][xs] = 1;
while (!q.empty())
{
int i = q.front().first;
int j = q.front().second;
q.pop();
for (int k = 0; k < 4; ++k)
{
int y = i + dy[k];
int x = j + dx[k];
if (inside(y, x) && a[y][x] != '*' && !visited[y][x] && dist[y][x] >= value)
{
visited[y][x] = 1;
q.push({y, x});
}
}
}
return visited[yf][xf];
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin >> n >> m;
queue<pair<int,int>> q2;
int ys, xs, yf, xf;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
char c;
cin >> c;
if (c == 'I')
ys = i, xs = j;
else if (c == 'O')
yf = i, xf = j;
else if (c == 'D')
{
q2.push({i, j});
visited[i][j] = 1;
}
a[i][j] = c;
}
while (!q2.empty())
{
int i = q2.front().first;
int j = q2.front().second;
q2.pop();
for (int k = 0; k < 4; ++k)
{
int y = i + dy[k];
int x = j + dx[k];
if (inside(y, x) && a[y][x] != '*' && !visited[y][x])
{
dist[y][x] = dist[i][j] + 1;
visited[y][x] = 1;
q2.push({y, x});
}
}
}
int left = 1, right = 1e6, ans = -1;
while (left <= right)
{
int middle = left + (right - left) / 2;
if (bfs(ys, xs, yf, xf, middle))
{
ans = middle;
left = middle + 1;
}
else
right = middle - 1;
}
cout << ans;
return 0;
}