Pagini recente » Cod sursa (job #2940367) | Cod sursa (job #2334253) | Cod sursa (job #2100892) | Cod sursa (job #2170738) | Cod sursa (job #2446413)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int nmax = 1005;
const int INF = 1e9;
int n, m, dp[nmax][nmax][2], x, y, xx, yy;
queue < pair < int, int > > C;
int di[4] = {1, -1, 0, 0};
int dj[4] = {0, 0, 1, -1};
char matrix[nmax][nmax];
void read()
{
fin >> n >> m;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
{
fin >> matrix[i][j];
dp[i][j][0] = INF;
if(matrix[i][j] == 'D')
{
dp[i][j][0] = 0;
C.push({i, j});
}
if(matrix[i][j] == 'I')
{
x = i;
y = j;
}
if(matrix[i][j] == 'O')
{
xx = i;
yy = j;
}
}
}
bool ok(int i, int j)
{
return i >= 1 && j >= 1 && i <= n && j <= m && matrix[i][j] != '*';
}
bool bfs(int mid)
{
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= m; ++j)
dp[i][j][1] = INF;
if(dp[x][y][0] < mid)
return false;
dp[x][y][1] = 0;
C.push({x, y});
while(!C.empty())
{
int i = C.front().first;
int j = C.front().second;
C.pop();
for(int d = 0; d < 4; d++)
{
int ii = i + di[d];
int jj = j + dj[d];
if(ok(ii, jj) && dp[ii][jj][1] == INF && dp[ii][jj][0] >= mid)
{
dp[ii][jj][1] = dp[i][j][1] + 1;
C.push({ii, jj});
}
}
}
if(dp[xx][yy][1] == INF)
return false;
return true;
}
void solve()
{
while(!C.empty())
{
int i = C.front().first;
int j = C.front().second;
C.pop();
for(int d = 0; d < 4; d++)
{
int ii = i + di[d];
int jj = j + dj[d];
if(dp[ii][jj][0] > dp[i][j][0] && ok(ii, jj))
{
dp[ii][jj][0] = dp[i][j][0] + 1;
C.push({ii, jj});
}
}
}
int st = 1, dr = n*m, sol = -1;
while(st <= dr)
{
int mid = (st + dr) / 2;
if(bfs(mid))
{
sol = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
fout << sol;
}
int main()
{
read();
solve();
return 0;
}