Pagini recente » Cod sursa (job #362090) | Cod sursa (job #1870347) | Cod sursa (job #141296) | Cod sursa (job #118167) | Cod sursa (job #3134482)
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int MAX_N = 1005;
const int di[] = {0, 0, 1, -1};
const int dj[] = {1, - 1, 0, 0};
int n, m, startI, startJ, finishI, finishJ;
int a[MAX_N + 1][MAX_N + 1], b[MAX_N + 1][MAX_N + 1];
queue <pair <int, int > > q, dragonQueue;
void print()
{
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
cout << b[i][j] << " ";
cout << "\n";
}
cout << "\n";
}
void borderMatrix()
{
for(int i = 1; i <= n; i ++)
b[i][0] = b[i][m + 1] = -1;
for(int j = 1; j <= m; j ++)
b[0][j] = b[n + 1][j] = -1;
}
void regenerateBoard(int radius)
{
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
b[i][j] = a[i][j];
if(a[i][j] == -2)
dragonQueue.push({i, j});
}
while(!dragonQueue.empty())
{
int i, j;
i = dragonQueue.front().first;
j = dragonQueue.front().second;
dragonQueue.pop();
for(int k = 0; k < 4; k ++)
if(b[i + di[k]][j + dj[k]] == 0 && -b[i][j] < radius + 1)
{
b[i + di[k]][j + dj[k]] = b[i][j] - 1;
dragonQueue.push({i + di[k], j + dj[k]});
}
}
}
bool solve()
{
if(b[startI][startJ])
return 0;
b[startI][startJ] = 1;
q.push({startI,startJ});
while(!q.empty())
{
int i, j;
i = q.front().first;
j = q.front().second;
q.pop();
for(int k = 0; k < 4; k ++)
if(b[i + di[k]][j + dj[k]] == 0)
{
b[i + di[k]][j + dj[k]] = b[i][j] + 1;
q.push({i + di[k], j + dj[k]});
}
}
return b[finishI][finishJ] > 0;
}
bool ok(int radius)
{
regenerateBoard(radius);
return solve();
}
int bs()
{
int st = 1, dr = n * m, med, last = -1;
while(st <= dr)
{
med = (st + dr) / 2;
if(ok(med))
{
st = med + 1;
last = med;
}
else
dr = med - 1;
}
return last;
}
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
cin >> n >> m;
borderMatrix();
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
char ch;
cin >> ch;
if(ch == 'I')
{
startI = i;;
startJ = j;
}
else if(ch == 'O')
{
finishI = i;
finishJ = j;
}
else if(ch == '*')
{
a[i][j] = -1;
b[i][j] = -1;
}
else if(ch == '.')
a[i][j] = 0;
else
a[i][j] = -2;
}
}
cout << bs();
return 0;
}