Pagini recente » Diferente pentru utilizator/blacknesta intre reviziile 93 si 19 | Istoria paginii utilizator/ultras89 | Monitorul de evaluare | Istoria paginii runda/qwerty-7 | Cod sursa (job #2007345)
#include <fstream>
#include <iostream>
#include <queue>
#define inf 0x3f3f3f3f
#define maxn 1005
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int dY[4] = {1, -1, 0, 0};
int dX[4] = {0, 0, 1, -1};
int r, c;
pair < int, int > x, y;
int v[maxn][maxn];
int a[maxn][maxn];
queue < pair < int, int > > q;
void Read(){
f >> r >> c;
for(int i = 1; i <= r; ++i){
for(int j = 1; j <= c; ++j){
char k; f >> k;
a[i][j] = inf;
if (k == '*') a[i][j] = -1;
else if (k == 'I') x.first = i, x.second = j;
else if (k == 'O') y.first = i, y.second = j;
else if (k == 'D') q.push(make_pair(i, j)), a[i][j] = 0;;
}
}
}
bool Check(int i, int j){
if(i < 1 or i > r or j < 1 or j > c) return false;
if(a[i][j] == -1) return false;
return true;
}
void Solve(){
int hi = min(a[x.first][x.second], a[y.first][y.second]);
int lo = 0;
int i, j, in, jn;
int mid, sol = -1;
while(lo <= hi){
int ok = 0;
mid = (hi + lo) / 2;
q.push(make_pair(x.first, x.second));
v[x.first][x.second] = 1;
while(!q.empty()){
i = q.front().first;
j = q.front().second;
q.pop();
for(int l = 0; l < 4; ++l){
in = i + dX[l];
jn = j + dY[l];
if(Check(in, jn) && a[in][jn] >= mid && !v[in][jn]){
v[in][jn] = 1;
q.push(make_pair(in, jn));
if(v[y.first][y.second]){
sol = max(sol, mid);
ok = 1;
}
}
if(ok) break;
}
while(ok && !q.empty()) q.pop();
}
for(i = 1; i <= r; ++i){
for(j = 1; j <= c; ++j)
v[i][j] = 0;
}
if(ok) lo = mid + 1;
else hi = mid - 1;
}
g << sol << '\n';
}
void BFS(){
int i, j, in, jn;
while(!q.empty()){
i = q.front().first;
j = q.front().second;
q.pop();
for(int l = 0; l < 4; ++l){
in = i + dX[l];
jn = j + dY[l];
if(Check(in, jn)){
int dist = a[i][j] + 1;
if(dist < a[in][jn]){
q.push(make_pair(in, jn));
a[in][jn] = dist;
}
}
}
}
}
int main(){
Read();
BFS();
Solve();
}