Pagini recente » Cod sursa (job #2064847) | Cod sursa (job #3196530) | Cod sursa (job #631798) | Cod sursa (job #2947174) | Cod sursa (job #2966846)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("barbar.in");
ofstream out ("barbar.out");
int c[1001][1001];
int d[1001][1001];
int n, m;
// dc nu merge "y1"?
int x1, yy1, x2, y2;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
bool check (int val)
{
if (c[x1][yy1] < val)
return false;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
d[i][j] = 0;
}
d[x1][yy1] = 1;
queue<pair<int, int>>q;
q.push({x1, yy1});
while (!q.empty())
{
int xx = q.front().first, yy = q.front().second;
if (xx == x2 && yy == y2)
return true;
for (int k=0; k<4; k++)
{
int i = xx + dx[k], j = yy + dy[k];
if (i > 0 && j > 0 && i <= n && j <= m && !d[i][j] && c[i][j] >= val)
{
q.push({i, j});
d[i][j] = d[xx][yy] + 1;
}
}
q.pop();
}
return false;
}
int main()
{
in >> n >> m;
queue<pair<int, int>>q;
for (int i=1; i<=n; i++)
{
for (int j=1; j<=m; j++)
{
char ch;
in >> ch;
if (ch == 'I')
x1 = i, yy1 = j;
else if (ch == 'O')
x2 = i, y2 = j;
else if (ch == 'D')
c[i][j] = 2e9, q.push({i, j});
else if (ch == '*')
c[i][j] = 2e9;
}
}
while (!q.empty())
{
int xx = q.front().first, yy = q.front().second;
q.pop();
for (int k=0; k<4; k++)
{
int i = xx + dx[k], j = yy + dy[k];
if (i > 0 && j > 0 && i <= n && j <= m && !c[i][j])
{
if (c[xx][yy] == 2e9)
c[i][j] = 1;
else
c[i][j] = c[xx][yy] + 1;
q.push({i, j});
}
}
}
int l=0, r=1e9;
int sol = -1;
while (l <= r)
{
int mid = (l + r) / 2;
if (check(mid))
l = mid + 1, sol = mid;
else
r = mid - 1;
}
out << sol;
return 0;
}