Pagini recente » Cod sursa (job #1383900) | Cod sursa (job #2355364) | Cod sursa (job #1909974) | Cod sursa (job #2521989) | Cod sursa (job #2672791)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int NMAX = 1005;
const int di[] = {1, 0, -1, 0};
const int dj[] = {0, 1, 0, -1};
queue<pair<int, int>> q;
int n, m, mt[NMAX][NMAX], dm[NMAX][NMAX], mx;
char c;
pair<int, int> start, finish;
bool whoke(int i, int j)
{
return i && j && i <= n && j <= m;
}
void LeeD()
{
while (!q.empty())
{
int i = q.front().first,
j = q.front().second;
q.pop();
for (int k = 0; k < 4; ++k)
{
int ni = di[k] + i,
nj = dj[k] + j;
if (whoke(ni, nj) && (!dm[ni][nj] || dm[ni][nj] > dm[i][j] + 1) && mt[ni][nj] != -1)
{
q.push({ni, nj});
dm[ni][nj] = dm[i][j] + 1;
}
}
}
mt[start.first][start.second] = dm[start.first][start.second];
}
void LeeB()
{
while (!q.empty())
{
int i = q.front().first,
j = q.front().second;
q.pop();
for (int k = 0; k < 4; ++k)
{
int ni = di[k] + i,
nj = dj[k] + j;
mx = min(mt[i][j], dm[ni][nj]);
if (whoke(ni, nj) && mt[ni][nj] != -1 && mt[ni][nj] < mx)
{
q.push({ni, nj});
mt[ni][nj] = mx;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
fin.tie(0);
fin >> n >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
fin >> c;
if (c == 'D')
mt[i][j] = 1, q.push({i, j});
else if (c == '*')
mt[i][j] = -1;
else if (c == 'I')
start = {i, j};
else if (c == 'O')
finish = {i, j};
}
LeeD();
q.push({start.first, start.second});
LeeB();
fout << mt[finish.first][finish.second];
return 0;
}