Pagini recente » Cod sursa (job #19972) | Cod sursa (job #3204222) | Cod sursa (job #351418) | Cod sursa (job #1522892) | Cod sursa (job #2029961)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF (1<<30)
#define pii pair <int, int>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int R, C, x, y, xx, yy;
char mat[NMAX][NMAX];
int viz[NMAX][NMAX], dragoni[NMAX][NMAX], di[NMAX][NMAX];
queue <pii> q;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
int interior(int i, int j)
{
return i >= 1 && j >= 1 && i <= R && j <= C;
}
void initial(int i, int j)
{
for (int d = 0; d < 4; d++)
{
int ii = i + dx[d];
int jj = j + dy[d];
if (dragoni[i][j] + 1 < dragoni[ii][jj] && mat[ii][jj] != '*' && interior(ii, jj))
{
q.push({ii, jj});
dragoni[ii][jj] = dragoni[i][j] + 1;
}
}
}
void bfs(int i, int j, int dist)
{
for (int d = 0; d < 4; d++)
{
int ii = i + dx[d];
int jj = j + dy[d];
if (di[i][j] + 1 < di[ii][jj] && mat[ii][jj] != '*' && interior(ii,jj) && dragoni[ii][jj] >= dist)
{
q.push({ii,jj});
di[ii][jj] = di[i][j] + 1;
}
}
}
int verificare(int dist)
{
if (dragoni[x][y] < dist)return 0;
for (int i = 1; i <= R; i++)
for (int j = 1; j <= C; j++)
di[i][j] = INF;
q.push({x, y});
di[x][y] = 0;
while (!q.empty())
{
pii nr = q.front();
int i = nr.first;
int j = nr.second;
q.pop();
bfs(i, j, dist);
}
if (di[xx][yy] == INF)
return 0;
return 1;
}
int main()
{
fin >> R >> C;
for (int i = 1; i <= R; i++)
for (int j = 1; j <= C; j++)
{
dragoni[i][j] = INF;
fin >> mat[i][j];
if (mat[i][j] == 'D')
q.push({i, j}), dragoni[i][j] = 0;
if (mat[i][j] == 'I')
x = i, y = j;
if (mat[i][j] == 'O')
xx = i, yy = j;
}
while (!q.empty())
{
pii nr = q.front();
int i = nr.first;
int j = nr.second;
q.pop();
initial(i, j);
}
int st = 0, dr = max(R, C) + 1;
while (st < dr)
{
int mij = (st + dr + 1) / 2;
if (verificare(mij) == 1)
st = mij;
else dr = mij - 1;
}
if (st == 0)
fout << st << " ";
else fout << st << "\n";
return 0;
}