Pagini recente » Cod sursa (job #2886594) | Cod sursa (job #1119582) | Cod sursa (job #229399) | Cod sursa (job #1644405) | Cod sursa (job #2627319)
#include <bits/stdc++.h>
#define perete 9999999
using namespace std; ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, xstart, ystart, xfinish, yfinish;
char ch;
int a[1005][1005], b[1005][1005];
bool viz[1005][1005], ok;
struct node
{
int x, y;
};
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, 1, -1};
queue<node> q;
void Read()
{
f>>n>>m;
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
{
f>>ch;
b[i][j] = 0x3f3f3f3f;
if(ch == '*')
a[i][j] = perete;
if(ch == 'D')
q.push({i, j}), b[i][j] = 0;
if(ch == 'I')
xstart = i, ystart = j;
if(ch == 'O')
xfinish = i, yfinish = j;
}
}
void Prepare()
{
int x_new, y_new, x, y;
while(!q.empty())
{
x = q.front().x;
y = q.front().y;
q.pop();
for(int i = 0;i < 4;++i)
{
x_new = dx[i] + x;
y_new = dy[i] + y;
if(x_new < 1 || y_new < 1 || x_new > n || y_new > m || a[x_new][y_new] == perete)
continue;
if(b[x_new][y_new] > b[x][y] + 1)
{
q.push({x_new, y_new});
b[x_new][y_new] = b[x][y] + 1;
}
}
}
}
void check(int x, int y, int val)
{
int x_new, y_new;
if(ok)
return;
if(b[x][y] < val || viz[x][y] || a[x][y] == perete)
return;
if(x == xfinish && y == yfinish)
{
ok = true;
return;
}
viz[x][y] = true;
for(int i = 0;i < 4;++i)
{
x_new = dx[i] + x;
y_new = dy[i] + y;
if(x_new < 1 || y_new < 1 || x_new > n || y_new > m)
continue;
check(x_new, y_new, val);
}
}
void Solve()
{
int rez = perete, low = 1, high = m * n + 2, mid;
while(low <= high)
{
mid = (low + high) / 2;
ok = false;
for(int i = 1;i <= n;++i) for(int j = 1;j <= n;++j) viz[i][j] = false;
if(b[xfinish][yfinish] >= mid)
check(xstart, ystart, mid);
if(ok)
rez = mid, low = mid + 1;
else
high = mid - 1;
}
if(rez == perete)
g<<-1;
else
g<<rez;
}
int main()
{
Read();
Prepare();
Solve();
return 0;
}