Pagini recente » Cod sursa (job #1532767) | Cod sursa (job #2696475) | Cod sursa (job #2764898) | Cod sursa (job #1778096) | Cod sursa (job #2828647)
#include <bits/stdc++.h>
#define DIM 1005
#define PII pair <int, int>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, distDrake[DIM][DIM], dist[DIM][DIM];
char s[DIM][DIM];
PII start, finish;
queue <PII> q;
int dl[] = {0, 1, 0, -1}, dc[] = {1, 0, -1, 0};
bool valid(int x, int y)
{
return x >= 1 && x <= n && y >= 1 && y <= m;
}
void init()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (s[i][j] == '*')
dist[i][j] = -1;
else if (s[i][j] == 'I')
dist[i][j] = 1;
else
dist[i][j] = 0;
}
}
void bfsDrakes()
{
while (!q.empty())
{
PII nod = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
PII newNod = {nod.first + dl[i], nod.second + dc[i]};
if (valid(newNod.first, newNod.second) && distDrake[newNod.first][newNod.second] == 0)
{
distDrake[newNod.first][newNod.second] = distDrake[nod.first][nod.second] + 1;
q.push(newNod);
}
}
}
}
bool bfs(int distMin)
{
init();
q.push(start);
while (!q.empty())
{
PII nod = q.front();
q.pop();
for (int i = 0; i < 4; i++)
{
PII newNod = {nod.first + dl[i], nod.second + dc[i]};
if (valid(newNod.first, newNod.second) && distDrake[newNod.first][newNod.second] >= distMin && dist[newNod.first][newNod.second] == 0)
{
dist[newNod.first][newNod.second] = dist[nod.first][nod.second] + 1;
q.push(newNod);
}
}
}
if (dist[finish.first][finish.second])
return 1;
else
return 0;
}
int main()
{
f >> n >> m;
for (int i = 1; i <= n; i++)
{
f >> s[i] + 1;
for (int j = 1; j <= n; j++)
{
if (s[i][j] == 'I')
start = {i, j};
else if (s[i][j] == 'D')
q.push({i, j}), distDrake[i][j] = 1;
else if (s[i][j] == 'O')
finish = {i, j};
}
}
bfsDrakes();
int st = 1, dr = n * m, ans = 0;
while (st <= dr)
{
int mid = (st + dr) / 2;
if (bfs(mid))
ans = mid, st = mid + 1;
else
dr = mid - 1;
}
g << ans - 1;
return 0;
}