Pagini recente » Cod sursa (job #750600) | Cod sursa (job #3331832) | Cod sursa (job #2074956) | Cod sursa (job #2169892) | Cod sursa (job #3313511)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int dx[] = {-1,0,1,0};
const int dy[] = {0,1,0,-1};
const int MAXN = 1001;
int n, m;
char a[MAXN][MAXN];
int dragon_dist[MAXN][MAXN];
pair<int,int> start, exit_;
void compute_dragon_dist()//distanta de la dragoni la puncte
{
queue<pair<int,int>> q;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
dragon_dist[i][j] = -1;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(a[i][j] == 'D')
{
q.push({i,j});
dragon_dist[i][j] = 0;
}
while(!q.empty())
{
auto [x,y] = q.front();
q.pop();
for(int d = 0; d < 4; d++)
{
int nx = x + dx[d];
int ny = y + dy[d];
if(nx >= 0 && ny >= 0 && nx < n && ny < m && a[nx][ny] != '*' && dragon_dist[nx][ny] == -1)
{
dragon_dist[nx][ny] = dragon_dist[x][y] + 1;
q.push({nx, ny});
}
}
}
}
bool can_escape(int min_dist)
{
if(dragon_dist[start.first][start.second] < min_dist)
return false;
vector<vector<bool>> vis(n+1,vector<bool>(m,false));
queue<pair<int,int>> q;
q.push(start);
vis[start.first][start.second] = true;
while(!q.empty())
{
auto [x,y] = q.front();
q.pop();
if(x == exit_.first && y == exit_.second)
return true;
for(int d = 0; d < 4; d++)
{
int nx = x + dx[d];
int ny = y + dy[d];
if(nx >= 0 && ny >= 0 && nx < n && ny < m && !vis[nx][ny] && a[nx][ny] != '*' && dragon_dist[nx][ny] >= min_dist)
{
vis[nx][ny] = true;
q.push({nx, ny});
}
}
}
return false;
}
int main()
{
fin >> n >> m;
for(int i = 0; i < n; i++)
{
fin >> a[i];
for(int j = 0; j < m; j++)
{
if(a[i][j] == 'I')
start = {i,j};
if(a[i][j] == 'O')
exit_ = {i,j};
}
}
compute_dragon_dist();
int st = 0, dr = n + m, ans = -1;
while(st <= dr)
{
int mid = (st + dr)/2;
if(can_escape(mid))
{
ans = mid;
st = mid + 1;
}
else
{
dr = mid - 1;
}
}
fout << ans;
return 0;
}