Pagini recente » Cod sursa (job #3348665) | Cod sursa (job #3318347) | Cod sursa (job #3307141) | Cod sursa (job #3347609) | Cod sursa (job #3353516)
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int dist[N + 1][N + 1], mers[N + 1][N + 1];
char v[N + 1][N + 1];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
int n, m, xo, yo, xi, yi;
queue <pair <int, int> > q;
int i, j, x, y, st, dr, mij, rez = -1;
bool is_ok(int i, int j)
{
if(i > 0 && i <= n && j > 0 && j <= m && dist[i][j] == 0 && v[i][j] != '*' && v[i][j] != 'D')
return true;
return false;
}
bool is_ok1(int i, int j, int mij)
{
if(i > 0 && i <= n && j > 0 && j <= m && mers[i][j] == 0 && dist[i][j] >= mij && v[i][j] != '*')
return true;
return false;
}
bool check(int distanta)
{
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
mers[i][j] = 0;
}
}
q.push(make_pair(xo, yo));
while(!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for(int d = 0; d < 4; d++)
{
x = i + dx[d];
y = j + dy[d];
if(is_ok1(x, y, distanta))
{
mers[x][y] = mers[i][j] + 1;
q.push(make_pair(x, y));
}
}
}
if(mers[xi][yi] > 0)
return true;
return false;
}
int main()
{
ifstream cin("barbar.in");
ofstream cout("barbar.out");
cin >> n >> m;
for(i = 1; i <= n; i++)
{
cin.get();
for(j = 1; j <= m; j++)
{
v[i][j] = cin.get();
if(v[i][j] == 'D')
{
q.push(make_pair(i, j));
}
else if(v[i][j] == 'O')
{
xo = i;
yo = j;
}
else if(v[i][j] == 'I')
{
xi = i;
yi = j;
}
}
}
while(!q.empty())
{
i = q.front().first;
j = q.front().second;
q.pop();
for(int d = 0; d < 4; d++)
{
x = i + dx[d];
y = j + dy[d];
if(is_ok(x, y))
{
dist[x][y] = dist[i][j] + 1;
q.push(make_pair(x, y));
}
}
}
/*for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
printf("%d ",dist[i][j]);
}
printf("\n");
}*/
st = 0;
dr = N;
while(st <= dr)
{
mij = (st + dr) / 2;
if(check(mij))
{
rez = mij;
st = mij + 1;
}
else
{
dr = mij - 1;
}
}
cout << rez;
return 0;
}