Pagini recente » Cod sursa (job #2339843) | Cod sursa (job #2129279) | Cod sursa (job #486702) | Cod sursa (job #2867574) | Cod sursa (job #3238554)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, d[1005][1005];
char a[1005][1005];
queue<pair <int, int>> q;
bitset <1005> v[1005];
int dx[] = { -1, 0, 1, 0 };
int dy[] = { 0, 1, 0, -1 };
pair <int, int> start, finish;
void read()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
{
for(int j=1; j <= m; j++)
fin >> a[i][j];
}
}
void Bordare()
{
for (int i = 0; i <= n + 1; i++)
a[i][0] = a[i][m + 1] = '*';
for (int j = 0; j <= m + 1; j++)
a[0][j] = a[n+1][j] = '*';
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
d[i][j] = INT_MAX;
}
void Lee()
{
while(!q.empty())
{
int i, j;
i = q.front().first;
j = q.front().second;
q.pop();
for (int k=0; k < 4; k++)
{
int x=i+dx[k];
int y=j + dy[k];
if (a[x][y] != '*' && d[x][y] > d[i][j] + 1)
{
d[x][y] = d[i][j] + 1;
q.push({x, y});
}
}
}
}
void Fill(int i, int j, int val)
{
v[i][j]=1;
for (int k = 0; k < 4; k++)
{
int x = i + dx[k];
int y = j + dy[k];
if (a[x][y] != '*' && v[x][y] == 0 && d[x][y] >= val)
Fill (x, y, val);
}
}
int BinSearch()
{
int left, right, mid, maxval = -1;
left = 0;
right = min(d[start.first][start.second], d[finish.first][finish.second]);
while (left <= right)
{
int mid = (left + right)/2;
Fill(start.first, start.second, mid);
if (v[finish.first][finish.second] == 1)
{
maxval = mid;
left = mid + 1;
}
else right = mid - 1;
for (int i = 1; i <= n; i++)
v[i].reset();
}
return maxval;
}
void solve()
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (a[i][j] == 'D')
{
q.push({ i, j });
d[i][j] = 0;
}
else if (a[i][j] == 'I')
start = { i, j };
else if (a[i][j] == 'O')
finish = { i, j };
}
Lee();
cout << BinSearch() << '\n';
}
int main()
{
read();
Bordare();
solve();
return 0;
}