Pagini recente » Cod sursa (job #478452) | Cod sursa (job #2518126) | Cod sursa (job #2759763) | Cod sursa (job #234336) | Cod sursa (job #2671910)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
const int N_MAX = 10005;
int matrix_pf[N_MAX][N_MAX];
int matrix_dr[N_MAX][N_MAX];
std :: queue <std :: pair <int, int>> dq;
std :: string readline;
int n, m;
int start_pf_x, start_pf_y, stop_pf_x, stop_pf_y;
int line[] = {-1, 1, 0, 0};
int column[] = {0, 0, 1, -1};
int maxim;
// a = matrix_dr
// b = matrix_pf
// dx = dq_dr
// dy = dq_pf
// ls = start_pf_x
// cs = start_pf_y
void create_margin() {
for (int i = 0; i <= n + 1; ++i) {
matrix_dr[i][0] = matrix_dr[i][m + 1] = -1;
matrix_pf[i][0] = matrix_pf[i][m + 1] = -1;
}
for (int i = 0; i <= m + 1; ++i) {
matrix_dr[0][i] = matrix_dr[n + 1][i] = -1;
matrix_pf[0][i] = matrix_pf[n + 1][i] = -1;
}
}
void lee_dr() {
while (!dq.empty()) {
int st, nd;
st = dq.front().first;
nd = dq.front().second;
dq.pop();
for (int i = 0; i < 4; ++i) {
int next_st, next_nd;
next_st = st + line[i];
next_nd = nd + column[i];
if (matrix_dr[next_st][next_nd] == 0 or matrix_dr[next_st][next_nd] > matrix_dr[st][nd] + 1) {
matrix_dr[next_st][next_nd] = matrix_dr[st][nd] + 1;
dq.push(std :: make_pair(next_st, next_nd));
}
}
}
}
void lee_pf() {
while(!dq.empty()) {
int st, nd;
st = dq.front().first;
nd = dq.front().second;
dq.pop();
for (int i = 0; i < 4; ++i) {
int next_st, next_nd;
next_st = st + line[i];
next_nd = nd + column[i];
maxim = std :: min(matrix_dr[next_st][next_nd], matrix_pf[st][nd]);
if (matrix_pf[next_st][next_nd] != -1 and matrix_pf[next_st][next_nd] < maxim) {
matrix_pf[next_st][next_nd] = maxim;
dq.push(std :: make_pair(next_st, next_nd));
}
}
}
}
int main() {
std :: ifstream fin ("barbar.in");
std :: ofstream fout ("barbar.out");
fin >> n >> m;
for (int i = 1; i <= n; ++i) {
fin >> readline;
for (int j = 0; j < m; ++j) {
if (readline[j] == 'D') {
matrix_dr[i][j+1] = 1;
dq.push(std :: make_pair(i, j+1));
} else if (readline[j] == '*') {
matrix_dr[i][j + 1] = -1;
matrix_pf[i][j + 1] = -1;
} else if (readline[j] == 'I') {
start_pf_x = i;
start_pf_y = j + 1;
} else if (readline[j] == 'O') {
stop_pf_x = i;
stop_pf_y = j + 1;
}
}
}
create_margin();
lee_dr();
matrix_pf[start_pf_x][start_pf_y] = matrix_dr[start_pf_x][start_pf_y];
dq.push(std :: make_pair(start_pf_x, start_pf_y));
lee_pf();
fout << matrix_pf[stop_pf_x][stop_pf_y] - 1;
return 0;
}