Pagini recente » Cod sursa (job #3187889) | Cod sursa (job #2959788) | Cod sursa (job #2115177) | Cod sursa (job #3129453) | Cod sursa (job #3258219)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define N_MAX 1000
#define NR_DIR 4
int dist[N_MAX][N_MAX], visited[N_MAX][N_MAX];
char v[N_MAX][N_MAX];
int n, m, lin_i, col_i, lin_o, col_o;
int dir_lin[NR_DIR] = {-1, 1, 0, 0};
int dir_col[NR_DIR] = {0, 0, -1, 1};
int is_valid(int lin, int col) {
return (lin >= 0 && col >= 0 && lin < n && col < m && !visited[lin][col]);
}
void bfs() {
queue<pair<int,int>> q;
int i, j, lin, col, new_lin, new_col;
for(i = 0; i < n; ++i) {
for(j = 0; j < m; ++j) {
if(v[i][j] == 'D') {
q.push({i, j});
visited[i][j] = 1;
}
}
}
while(!q.empty()) {
lin = q.front().first;
col = q.front().second;
for(i = 0; i < NR_DIR; ++i) {
new_lin = lin + dir_lin[i];
new_col = col + dir_col[i];
if(is_valid(new_lin, new_col) && v[new_lin][new_col] != '*') {
q.push({new_lin, new_col});
dist[new_lin][new_col] = dist[lin][col] + 1;
visited[new_lin][new_col] = 1;
}
}
q.pop();
}
}
int check(int d) {
if(dist[lin_i][col_i] < d) {
return 0;
}
queue<pair<int,int>> q;
int i, j, lin, col, new_lin, new_col;
q.push({lin_i, col_i});
for(i = 0; i < n; ++i) {
for(j = 0; j < m; ++j) {
visited[i][j] = 0;
}
}
visited[lin_i][col_i] = 1;
while(!q.empty()) {
lin = q.front().first;
col = q.front().second;
for(i = 0; i < NR_DIR; ++i) {
new_lin = lin + dir_lin[i];
new_col = col + dir_col[i];
if(is_valid(new_lin, new_col) && dist[new_lin][new_col] >= d && v[new_lin][new_col] != '*') {
q.push({new_lin, new_col});
visited[new_lin][new_col] = 1;
}
}
q.pop();
}
return visited[lin_o][col_o];
}
int main()
{
int i, j, st, dr, mid;
fin >> n >> m;
for(i = 0; i < n; ++i) {
for(j = 0; j < m; ++j) {
fin >> v[i][j];
if(v[i][j] == 'I') {
lin_i = i;
col_i = j;
}else if(v[i][j] == 'O') {
lin_o = i;
col_o = j;
}
}
}
bfs();
st = 0;
dr = N_MAX * N_MAX + 1;
while(st <= dr) {
mid = (st + dr) / 2;
if(check(mid)) {
st = mid + 1;
}else{
dr = mid - 1;
}
}
if(!check(1)) {
fout << "-1\n";
}else{
fout << dr << '\n';
}
return 0;
}