Pagini recente » Cod sursa (job #1235403) | Cod sursa (job #1369395) | Cod sursa (job #2258933) | Cod sursa (job #769355) | Cod sursa (job #2235871)
#include <bits/stdc++.h>
#define oo 2000000
using namespace std;
char a[1002][1002], b[1002][1002];
stack < pair <int, int> > st;
queue < pair <int, int> > q;
int d[1002][1002];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int n, m, xs, ys, xf, yf;
void Read ()
{
int i, j;
ifstream fin ("barbar.in");
fin >> n >> m;
for (i = 1; i <= n; i++)
fin >> (a[i] + 1);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (a[i][j] == 'I')
{
xs = i; ys = j;
}
else if (a[i][j] == 'O')
{
xf = i; yf = j;
}
fin.close();
}
void Board ()
{
int i;
for (i = 0; i <= n + 1; i++)
a[i][0] = a[i][m+1] = '*';
for (i = 0; i <= m + 1; i++)
a[0][i] = a[n+1][i] = '*';
}
/// merg de la poz xs, ys doar pe distante >= dist
void Fill (int dist)
{
int k, x, y, i, j;
/// initiez matricea b cu 0
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
b[i][j] = '0';
st.push({xs, ys});
b[xs][ys] = '1';
while (!st.empty())
{
i = st.top().first;
j = st.top().second;
st.pop();
for (k = 0; k <= 3; k++)
{
x = i + dx[k];
y = j + dy[k];
if (b[x][y] == '0' && d[x][y] >= dist && a[x][y] != '*')
{
st.push({x, y});
b[x][y] = '1';
}
}
}
}
void BinSearch ()
{
int st, dr, mij, sol;
st = 1;
dr = min (d[xs][ys], d[xf][yf]);
sol = -1;
while (st <= dr)
{
mij = (st + dr) / 2;
Fill (mij);
if (b[xf][yf] == '1')
{
sol = mij;
st = mij + 1;
}
else dr = mij - 1;
}
ofstream fout ("barbar.out");
fout << sol << "\n";
fout.close();
}
void Initiate ()
{
int i, j;
for (i = 0; i <= n + 1; i++)
for ( j = 0; j <= m + 1; j++)
d[i][j] = oo;
}
void Lee ()
{
int i, j, x, y, k;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (a[i][j] == 'D')
{
q.push({i, j});
d[i][j] = 0;
}
while (!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for (k = 0; k <= 3; k++)
{
x = i + dx[k];
y = j + dy[k];
if (a[x][y] != '*' && d[x][y] > d[i][j] + 1)
{
d[x][y] = d[i][j] + 1;
q.push ({x, y});
}
}
}
}
int main()
{
Read ();
Board();
Initiate();
Lee();
BinSearch();
return 0;
}