Pagini recente » Cod sursa (job #333871) | Cod sursa (job #2511544) | Cod sursa (job #669540) | Cod sursa (job #3228440) | Cod sursa (job #2707050)
#include <bits/stdc++.h>
//#pragma GCC optimize("O3")
#define test " test "
#define ll long long
#define pii pair<int, int>
#define FASTIO \
cin.tie(0); \
cout.tie(0); \
ios_base::sync_with_stdio(0);
#define FILES \
freopen("barbar.in", "r", stdin); \
freopen("barbar.out", "w", stdout);
#define testcase \
int T; \
cin >> T; \
while (T--)
#define vec vector<int>
using namespace std;
char c[1001][1001];
vector<pii> D;
pii start, finish;
int n, m, dx[] = {0, -1, 0, 1}, dy[] = {-1, 0, 1, 0};
bool lee(int mid)
{
vector<vector<bool>> alt;
alt.resize(n + 1, vector<bool>(m + 1));
for(int i = 0; i < D.size(); i++)
{
int x = D[i].first, y = D[i].second;
for(int i = -mid + 1; i <= mid - 1; i++)
for(int j = -mid + 1; j <= mid - 1; j++)
if(abs(i) + abs(j) < mid && x + i > 0 && x + i <= n && y + j > 0 && y + j <= m)
alt[x + i][y + j] = 1;
}
queue <pii> q;
q.push(start);
while(!q.empty())
{
int x = q.front().first, y = q.front().second;
q.pop();
for(int i = 0; i < 4; i++)
if(x + dx[i] > 0 && x + dx[i] <= n && y + dy[i] > 0 && y + dy[i] <= m)
if(!alt[x + dx[i]][y + dy[i]] && c[x + dx[i]][y + dy[i]] != '*')
{
if(make_pair(x + dx[i], y + dy[i]) == finish)
return 1;
else
{
alt[x + dx[i]][y + dy[i]] = 1;
q.push({x + dx[i], y + dy[i]});
}
}
}
return 0;
}
signed main()
{
FASTIO FILES
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
cin >> c[i][j];
if(c[i][j] == 'D')
D.push_back({i, j});
else if(c[i][j] == 'I')
start = {i, j};
else if(c[i][j] == 'O')
finish = {i, j};
}
int l = 0, r = max(n, m);
while(l < r - 1)
{
int mid = (l + r) / 2;
if(lee(mid))
l = mid;
else
r = mid;
}
cout << l;
return 0;
}