Pagini recente » Cod sursa (job #1884998) | Cod sursa (job #1224699) | Cod sursa (job #2762166) | Cod sursa (job #2570672) | Cod sursa (job #1429526)
#include <fstream>
#include <queue>
#include <utility>
#include <functional>
#include <cstring>
using namespace std;
static const int MAXN = 1009;
typedef pair<int, int> pii;
char t[MAXN][MAXN];
int D[MAXN][MAXN];
bool u[MAXN][MAXN];
int n, m;
pii s, d;
queue<pii> q;
int dx[] = {0, -1, 0, 1}, dy[] = {-1, 0, 1, 0};
void bfs() {
while(!q.empty()) {
pii src = q.front();
q.pop();
for(int k = 0; k < 4; k++) {
int ii = src.first + dx[k];
int jj = src.second + dy[k];
if(ii >= 0 && jj >= 0 && ii < n && jj < m && !u[ii][jj] && D[ii][jj] > D[src.first][src.second] + 1 && t[ii][jj] != '*') {
D[ii][jj] = D[src.first][src.second] + 1;
u[ii][jj] = true;
q.push(pii(ii, jj));
}
}
}
}
void bfs(pii src, int vmin) {
memset(u, 0, sizeof(u));
if(D[src.first][src.second] >= vmin) {
q.push(src);
u[src.first][src.second] = true;
}
while(!q.empty()) {
pii src = q.front();
q.pop();
for(int k = 0; k < 4; k++) {
int ii = src.first + dx[k];
int jj = src.second + dy[k];
if(ii >= 0 && jj >= 0 && ii < n && jj < m && !u[ii][jj] && D[ii][jj] >= vmin && (t[ii][jj] == '.' || t[ii][jj] == 'O' || t[ii][jj] == 'D')) {
u[ii][jj] = true;
q.push(pii(ii, jj));
}
}
}
}
int main() {
memset(D, 0x3F, sizeof(D));
ifstream f("barbar.in");
f >> n >> m;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++) {
f >> t[i][j];
if(t[i][j] == 'I') s = pii(i, j);
if(t[i][j] == 'O') d = pii(i, j);
if(t[i][j] == 'D') {
q.push(pii(i, j));
D[i][j] = 0;
u[i][j] = true;
}
}
}
f.close();
bfs();
int ans, pas;
for(pas = 1; pas <= n * m; pas <<= 1);
for(ans = -1; pas; pas >>= 1) {
bfs(s, ans + pas);
if(u[d.first][d.second]) ans += pas;
}
ofstream g("barbar.out");
g << ans << endl;
g.close();
return 0;
}