Pagini recente » Cod sursa (job #3332062) | Cod sursa (job #3338424) | Cod sursa (job #3345557) | Cod sursa (job #3336103) | Cod sursa (job #3354385)
#include <bits/stdc++.h>
using namespace std;
#define USE_STD_IO 0
#if USE_STD_IO
#define fin cin
#define fout cout
#else
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#endif // USE_STD_IO
const int DI[] = {1, -1, 0, 0};
const int DJ[] = {0, 0, 1, -1};
struct Pozitie {
int i, j;
};
queue<Pozitie> q;
int n, m, i, j, dist[1002][1002];
char mat[1002][1002];
Pozitie start, dest;
bool viz[1002][1002];
static inline void DistDragoni() {
while(!q.empty()) {
int i = q.front().i;
int j = q.front().j;
q.pop();
for(int dir = 0; dir < 4; dir++) {
int in = i + DI[dir];
int jn = j + DJ[dir];
if(!(1 <= in && in <= n && 1 <= jn && jn <= m)) continue;
if(0 == dist[in][jn] && '*' != mat[in][jn]) {
dist[in][jn] = 1 + dist[i][j];
q.push(Pozitie{in, jn});
}
}
}
}
static inline bool Parcurg(int mi) {
memset(viz, false, sizeof(viz));
q.push(start);
while(!q.empty()) {
int i = q.front().i;
int j = q.front().j;
q.pop();
for(int dir = 0; dir < 4; dir++) {
int in = i + DI[dir];
int jn = j + DJ[dir];
if(!(1 <= in && in <= n && 1 <= jn && jn <= m)) continue;
if(!viz[in][jn] && mi <= dist[in][jn] && '*' != mat[in][jn]) {
viz[in][jn] = true;
q.push(Pozitie{in, jn});
}
}
}
return viz[dest.i][dest.j];
}
static inline int CautBin() {
int st = 1, dr = n * m;
int rasp = -1;
while(st <= dr) {
int mij = st + (dr - st) / 2;
if(Parcurg(mij)) {
rasp = mij;
st = mij + 1;
}
else dr = mij - 1;
}
return rasp;
}
int main() {
if(USE_STD_IO) ios_base::sync_with_stdio(false);
fin.tie(NULL);
fout.tie(NULL);
fin >> n >> m;
for(i = 1; i <= n; i++) {
for(j = 1; j <= m; j++) {
fin >> mat[i][j];
switch(mat[i][j]) {
case 'I': start = {i, j}; break;
case 'D': q.push(Pozitie{i, j}); break;
case 'O': dest = {i, j}; break;
}
}
}
DistDragoni();
fout << CautBin();
return 0;
}