Pagini recente » Cod sursa (job #1361847) | Cod sursa (job #3227080) | Cod sursa (job #1463806) | Cod sursa (job #59720) | Cod sursa (job #3122172)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const short NMAX = 1000;
bool vis[NMAX+5][NMAX+5];
char a[NMAX+5][NMAX+5];
short d[NMAX+5][NMAX+5];
const short d1[] = {-1, 0, 1, 0};
const short d2[] = {0, 1, 0, -1};
queue<pair<short, short>> q;
pair<short, short> in, out;
short n, m;
bool valid(pair<short, short> x)
{
return x.first >= 1 && x.first <= n && x.second >= 1 && x.second <= m;
}
void intialize()
{
for (short i = 1; i <= n; i++)
for (short j = 1; j <= m; j++) vis[i][j] = false;
}
void clear()
{
while (!q.empty()) q.pop();
}
bool solution(short dist)
{
intialize();
q.push(in);
vis[in.first][in.second] = true;
while (!q.empty()) {
pair<short, short> x = q.front();
q.pop();
if (x.first == out.first && x.second == out.second) {
clear();
return true;
}
for (short dir = 0; dir < 4; dir++) {
pair<short, short> y = make_pair(x.first+d1[dir], x.second+d2[dir]);
if (valid(y) && d[y.first][y.second] >= dist && !vis[y.first][y.second])
q.push(y), vis[y.first][y.second] = true;
}
}
return false;
}
int main()
{
fin>>n>>m;
for (short i = 1; i <= n; i++)
for (short j = 1; j <= m; j++) {
fin>>a[i][j], d[i][j] = -1;
if (a[i][j] == 'D') d[i][j] = 0, q.push(make_pair(i, j));
if (a[i][j] == 'I') in = make_pair(i, j);
if (a[i][j] == 'O') out = make_pair(i, j);
}
while (!q.empty()) {
pair<short, short> x = q.front();
q.pop();
for (short dir = 0; dir < 4; dir++) {
pair<short, short> y = make_pair(x.first+d1[dir], x.second+d2[dir]);
if (valid(y) && a[y.first][y.second] != '*' && d[y.first][y.second] == -1)
q.push(y), d[y.first][y.second] = d[x.first][x.second]+1;
}
}
short left = 0, right = n+m, sol;
while (left <= right) {
short middle = (left+right)/2;
if (solution(middle)) sol = middle, left = middle+1;
else right = middle-1;
}
fout<<sol;
return 0;
}