Pagini recente » Cod sursa (job #2439880) | Cod sursa (job #2562770) | Cod sursa (job #1669525) | Cod sursa (job #2170771) | Cod sursa (job #3151720)
#include <fstream>
#include <map>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int NMAX = 1000;
const int di[] = {0, 0, 1, -1};
const int dj[] = {1, -1, 0, 0};
int n, m;
int a[NMAX + 1][NMAX + 1];
int istart, jstart, ifinal, jfinal;
int leeD[NMAX + 1][NMAX + 1];
int lee[NMAX + 1][NMAX + 1];
queue<pair<int, int>> Q;
bool InMat(int i, int j)
{
return i >= 1 && i <= n && j >= 1 && j <= n;
}
void LeeD()
{
while(!Q.empty())
{
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for(int d = 0; d < 4; d++)
{
int inou = i + di[d];
int jnou = j + dj[d];
if(InMat(inou, jnou) && !a[inou][jnou] && !leeD[inou][jnou])
{
leeD[inou][jnou] = leeD[i][j] + 1;
Q.push({inou, jnou});
}
}
}
}
bool Check(int distance)
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
lee[i][j] = 0;
queue<pair<int, int>> Q;
lee[istart][jstart] = 1;
Q.push({istart, jstart});
while(!Q.empty())
{
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for(int d = 0; d < 4; d++)
{
int inou = i + di[d];
int jnou = j + dj[d];
if(InMat(inou, jnou) && !a[inou][jnou] && !lee[inou][jnou] && leeD[inou][jnou] - 1 >= distance)
{
lee[inou][jnou] = lee[i][j] + 1;
Q.push({inou, jnou});
}
}
}
return (lee[ifinal][jfinal] != 0);
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
{
char x;
cin >> x;
if(x == '*')
a[i][j] = 1;
else if(x == 'I')
istart = i, jstart = j;
else if(x == 'O')
ifinal = i, jfinal = j;
else if(x == 'D')
{
leeD[i][j] = 1;
Q.push({i, j});
}
}
LeeD();
int st = 0, dr = 1e9, ans = -1;
while(st <= dr)
{
int mij = (st + dr) / 2;
if(Check(mij))
ans = mij, st = mij + 1;
else
dr = mij - 1;
}
cout << ans;
return 0;
}