Pagini recente » Cod sursa (job #1171804) | Cod sursa (job #1331051) | Cod sursa (job #2545584) | Cod sursa (job #2409833) | Cod sursa (job #2908583)
//coada implementata manual :))
#include <fstream>
#include <queue>
#include <climits>
using namespace std;
char s[1003][1003];
int d[1003][1003];
int oki[1003][1003];
pair <int, int> q[1000003];
int beg, fin;
pair <int, int> in, out;
int di[] = {-1, 1, 0, 0};
int dj[] = {0, 0, -1, 1}, n, m;
int cnt = 0;
bool ok(int val)
{
cnt++;
oki[in.first][in.second] = cnt;
beg = fin = 1;
q[beg] = in;
while (beg <= fin)
{
pair <int, int> f = q[beg];
//cout << f.first << " " << f.second << "\n";
beg++;
for (int i = 0; i < 4; i++)
{
int ni = f.first + di[i];
int nj = f.second + dj[i];
if (ni >= 1 and ni <= n and nj >= 1 and nj <= m and
oki[ni][nj] != cnt and
s[ni][nj] != '*' and d[ni][nj] >= val)
{
if (ni == out.first and nj == out.second)
return 1;
oki[ni][nj] = cnt;
q[++fin] = {ni, nj};
}
}
}
return 0;
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int i, j;
cin >> n >> m;
fin = 0;
beg = 1;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
cin >> s[i][j];
d[i][j] = INT_MAX;
if (s[i][j] == 'D')
{
q[++fin] = {i, j};
d[i][j] = 0;
}
else if (s[i][j] == 'I')
in = {i, j};
else if (s[i][j] == 'O')
out = {i, j};
}
}
//vad distanta minima fata de dragoni si celelalte patratele
while (beg <= fin)
{
pair <int, int> f = q[beg];
beg++;
for (int i = 0; i < 4; i++)
{
int ni = f.first + di[i];
int nj = f.second + dj[i];
if (ni >= 1 and ni <= n and nj >= 1 and nj <= m
and s[ni][nj] != '*')
{
if (d[ni][nj] > d[f.first][f.second] + 1)
{
d[ni][nj] = d[f.first][f.second] + 1;
q[++fin] = {ni, nj};
}
}
}
}/*
cout << "\n\n\n";
for (i = 1; i <= n; i++, cout << "\n")
for (j = 1; j <= m; j++)
cout << d[i][j] << " ";*/
int med, sol = -1, st = 1, dr = min(d[in.first][in.second], d[out.first][out.second]);
while (st <= dr)
{
med = ((st + dr) >> 1);
if (ok(med))
{
sol = med;
st = med + 1;
}
else
dr = med - 1;
}
cout << sol;
}