Pagini recente » Cod sursa (job #2487350) | Cod sursa (job #571336) | Cod sursa (job #1109008) | Cod sursa (job #1651006) | Cod sursa (job #2083019)
#include <bits/stdc++.h>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
#define x first
#define y second
const int NMAX = 1e3;
string str;
int n, m;
char a[NMAX + 5][NMAX + 5];
int dist[NMAX + 5][NMAX + 5];
bool vis[NMAX + 5][NMAX + 5];
queue<pair<int, int>> dragoni;
pair<int, int> start;
int dx[] = {0, 1, 0, -1},
dy[] = {1, 0, -1, 0};
void bordare();
void calcDist();
bool check(int arg)
{
if(dist[start.x][start.y] < arg)
return false;
memset(vis, 0, sizeof vis);
queue<pair<int, int>> q;
vis[start.x][start.y] = true;
q.push(start);
while(!q.empty())
{
pair<int, int> fr = q.front();
for(int d = 0; d < 4; d++)
{
pair<int, int> tmp = {fr.x + dx[d], fr.y +dy[d]};
if(!vis[tmp.x][tmp.y] && dist[tmp.x][tmp.y] >= arg && a[tmp.x][tmp.y] != '*')
{
if(a[tmp.x][tmp.y] == 'O')
return true;
vis[tmp.x][tmp.y] = true;
q.push(tmp);
}
}
q.pop();
}
return false;
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
in >> str;
for(int j = 1; j <= m; j++)
{
a[i][j] = str[j - 1];
if(a[i][j] == 'I')
start.x = i,
start.y = j;
if(a[i][j] == 'D')
{
dragoni.push({i, j});
vis[i][j] = true;
}
}
}
bordare();
calcDist();
int st = 0, dr = n * m, ans = -1;
while(st <= dr)
{
int med = (st + dr) / 2;
if(check(med))
{
st = med + 1;
ans = med;
}
else dr = med - 1;
}
out << ans << '\n';
return 0;
}
void bordare()
{
for(int i = 0; i <= n + 1; i++)
a[i][0] = a[i][n + 1] = '*';
for(int j = 0; j <= m + 1; j++)
a[0][j] = a[m + 1][j] = '*';
}
void calcDist()
{
while(!dragoni.empty())
{
pair<int, int> fr = dragoni.front();
for(int d = 0; d < 4; d++)
{
pair<int,int> tmp = {fr.x + dx[d], fr.y + dy[d]};
if(!vis[tmp.x][tmp.y] && a[tmp.x][tmp.y] != '*')
{
vis[tmp.x][tmp.y] = true;
dist[tmp.x][tmp.y] = dist[fr.x][fr.y] + 1;
dragoni.push(tmp);
}
}
dragoni.pop();
}
}