Pagini recente » Borderou de evaluare (job #707404) | Cod sursa (job #205593) | Cod sursa (job #2776508) | Rezultatele filtrării | Cod sursa (job #2242791)
#include <fstream>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int N = 1000 + 5;
int n, m;
int v[N][N], len[N][N];
int ri, ci;
int rf, cf;
struct info {
int r;
int c;
};
queue <info> q;
inline bool valid(int r, int c) {
if (1 <= r && 1 <= c && r <= n && c <= m) {
return 1;
}
return 0;
}
int dr[] = {- 1, 0, 1, 0};
int dc[] = {0, 1, 0, - 1};
bool seen[N][N];
inline void dfs(int r, int c, int d) {
seen[r][c] = 1;
for (int k = 0; k < 4; k++) {
int rn = r + dr[k];
int cn = c + dc[k];
if (valid(rn, cn) && v[rn][cn] == 0 && seen[rn][cn] == 0 && len[rn][cn] >= d) {
dfs(rn, cn, d);
}
}
}
inline bool ok(int d) {
if (len[ri][ci] < d) {
return 0;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
seen[i][j] = 0;
}
}
dfs (ri, ci, d);
return seen[rf][cf];
}
int main() {
fin >> n >> m;
for (int i = 1; i <= n; i++) {
string s;
fin >> s;
for (int j = 1; j <= m; j++) {
if (s[j - 1] == 'I') {
ri = i;
ci = j;
continue;
}
if (s[j - 1] == 'O') {
rf = i;
cf = j;
continue;
}
if (s[j - 1] == 'D') {
v[i][j] = 1;
}
if (s[j - 1] == '*') {
v[i][j] = 2;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (v[i][j] == 1) {
q.push({i, j});
len[i][j] = 0;
} else {
len[i][j] = - 1;
}
}
}
while (!q.empty()) {
int r = q.front().r;
int c = q.front().c;
q.pop();
for (int k = 0; k < 4; k++) {
int rn = r + dr[k];
int cn = c + dc[k];
if (valid(rn, cn) && v[rn][cn] != 2 && len[rn][cn] == - 1) {
len[rn][cn] = len[r][c] + 1;
q.push({rn, cn});
}
}
}
int r = 0, pas = (1 << 30);
while (pas) {
if (r + pas <= 2 * N && ok(r + pas) == 1) {
r += pas;
}
pas /= 2;
}
if (ok(r) == 0) {
r = - 1;
}
fout << r << "\n";
return 0;
}
/**
1 = dragon
2 = zid
**/