Pagini recente » Cod sursa (job #1154179) | Cod sursa (job #1069788) | Cod sursa (job #2470535) | Cod sursa (job #274509) | Cod sursa (job #2961664)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct pct
{
int x, y;
}start, finish;
const int NMAX = 1007;
int n, m;
vector<vector<int>> v(NMAX, vector<int>(NMAX));
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
bool inmat(int x, int y)
{
return (x >= 1 && x <= n && y >= 1 && y <= m);
}
int main()
{
fin >> n >> m;
queue<pct> dragon;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
char c;
fin >> c;
if(c == 'I')
{
start.x = i;
start.y = j;
v[i][j] = -1;
}
else if(c == 'O')
{
finish.x = i;
finish.y = j;
v[i][j] = -1;
}
else if(c == '*')
{
v[i][j] = -2;
}
else if(c == 'D')
{
v[i][j] = -0;
dragon.push({i, j});
}
else if(c == '.')
{
v[i][j] = -1;
}
}
}
while(!dragon.empty())
{
int i = dragon.front().x;
int j = dragon.front().y;
dragon.pop();
for(int d = 0; d < 4; d++)
{
int diri = i + dx[d];
int dirj = j + dy[d];
if(inmat(diri, dirj) && v[diri][dirj] == -1)
{
v[diri][dirj] = v[i][j] + 1;
dragon.push({diri, dirj});
}
}
}
int left = 1;
int right = n * m;
int mid;
int ans;
while(left <= right)
{
mid = (left + right) / 2;
if(v[start.x][start.y] >= mid)
{
vector<vector<bool>> ok(NMAX, vector<bool>(NMAX, false));
queue<pct> q;
q.push(start);
ok[start.x][start.y] = true;
while(!q.empty())
{
int i = q.front().x;
int j = q.front().y;
q.pop();
for(int d = 0; d < 4; d++)
{
int diri = i + dx[d];
int dirj = j + dy[d];
if(inmat(diri, dirj) && !ok[diri][dirj] && v[diri][dirj] >= mid)
{
ok[diri][dirj] = true;
q.push({diri, dirj});
}
}
}
if(ok[finish.x][finish.y])
{
ans = mid;
left = mid + 1;
}
else
{
right = mid - 1;
}
}
else
{
right = mid - 1;
}
}
fout << ans;
return 0;
}