Pagini recente » Cod sursa (job #1813539) | Cod sursa (job #2640721) | Cod sursa (job #2466694) | Cod sursa (job #438165) | Cod sursa (job #1541435)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define PII pair<int,int>
#define pb push_back
#define mp make_pair
const int DIM = 1005;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
int R, C;
int d[DIM][DIM];
char c;
bool used[DIM][DIM];
queue <PII> Q;
PII start, finish;
bool OK(int i, int j)
{
if(i < 1 || i > R || j < 1 || j > C)
return 0;
return 1;
}
bool check(int mindist)
{
memset(used, 0, sizeof(used));
if(d[start.first][start.second] <= mindist)
return 0;
Q.push(start);
while(!Q.empty())
{
PII node = Q.front();
Q.pop();
used[node.first][node.second] = 1;
for(int dir = 0; dir < 4; ++dir)
{
int i = node.first + dx[dir];
int j = node.second + dy[dir];
if(OK(i, j) && !used[i][j] && d[i][j] > mindist)
Q.push(mp(i, j));
}
}
return used[finish.first][finish.second];
}
void walls()
{
while(!Q.empty())
{
PII node = Q.front();
Q.pop();
for(int dir = 0; dir < 4; ++dir)
{
int i = node.first + dx[dir];
int j = node.second + dy[dir];
if(OK(i, j) && d[i][j] == 0)
{
d[i][j] = d[node.first][node.second] + 1;
Q.push(mp(i, j));
}
}
}
}
void bs()
{
int l = 1, r = R * C + 1;
int sol = -1;
walls();
while(l <= r)
{
int mid = (l + r) / 2;
if(check(mid))
{
sol = mid;
l = mid + 1;
}
else
r = mid - 1;
}
fout << sol;
}
int main()
{
fin >> R >> C;
for(int i = 1; i <= R; ++i)
{
for(int j = 1; j <= C; ++j)
{
fin >> c;
if(c == 'D')
{
d[i][j] = 1;
Q.push(mp(i, j));
continue;
}
if(c== 'I')
{
start.first = i;
start.second = j;
continue;
}
if (c == 'O')
{
finish.first = i;
finish.second = j;
continue;
}
if(c == '*')
d[i][j] = -1;
}
}
bs();
return 0;
}