Pagini recente » Cod sursa (job #1895238) | Cod sursa (job #2134872) | Cod sursa (job #3223611) | Cod sursa (job #97977) | Cod sursa (job #3265147)
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
char grid[1000][1000];
int dist_dragon[1000][1000];
bool vizitat[1000][1000];
int r, c, si, sj, ei, ej;
bool verificare(int nx, int ny) {
return nx >= 0 && nx < r && ny >= 0 && ny < c && grid[nx][ny] != '*';
}
bool valid(int min_dist)
{
queue<pair<int, int>> q;
for (int i = 0; i < r; i++)
for (int j = 0; j < c; j++)
vizitat[i][j] = false;
q.push({si, sj});
vizitat[si][sj] = true;
while (!q.empty())
{
int x = q.front().first, y = q.front().second;
q.pop();
if (x == ei && y == ej)
return true;
for (int k = 0; k < 4; k++)
{
int nx = x + dx[k], ny = y + dy[k];
if (verificare(nx, ny) && !vizitat[nx][ny] && dist_dragon[nx][ny] >= min_dist)
{
vizitat[nx][ny] = true;
q.push({nx, ny});
}
}
}
return false;
}
int main()
{
fin >> r >> c;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
fin >> grid[i][j];
if (grid[i][j] == 'I')
{
si = i;
sj = j;
}
else if (grid[i][j] == 'O')
{
ei = i;
ej = j;
}
}
}
queue<pair<int, int>> q;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
dist_dragon[i][j] = -1;
if (grid[i][j] == 'D')
{
q.push({i, j});
dist_dragon[i][j] = 0;
}
}
}
while (!q.empty())
{
int x = q.front().first, y = q.front().second;
q.pop();
for (int k = 0; k < 4; k++)
{
int nx = x + dx[k], ny = y + dy[k];
if (verificare(nx, ny) && dist_dragon[nx][ny] == -1)
{
dist_dragon[nx][ny] = dist_dragon[x][y] + 1;
q.push({nx, ny});
}
}
}
int st = 0, dr = 1000, rasp = -1;
while (st <= dr)
{
int mij = (st + dr) / 2;
if (valid(mij))
{
rasp = mij;
st = mij + 1;
}
else
{
dr = mij - 1;
}
}
fout << rasp;
return 0;
}