Pagini recente » Cod sursa (job #3254756) | Cod sursa (job #303222) | Cod sursa (job #3210789) | Cod sursa (job #1000462) | Cod sursa (job #2908758)
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[] = {-1, 0, 1, 0};
const int dj[] = {0, 1, 0, -1};
int n, m, is, js, iF, jF, matrLee[1005][1005], dist[1005][1005];
char v[1005][1005];
bool inMat(int i, int j) {
return i >= 1 && i <= n && j >= 1 && j <= m;
}
void lee() {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(v[i][j] != '*' && v[i][j] != 'D') {
matrLee[i][j] = (1 << 30);
}
}
}
queue<pair<int, int>> Q;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(v[i][j] == 'D') {
Q.push({i, j});
}
}
}
while(!Q.empty()) {
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for(int d = 0; d < 4; d++) {
int ii = i + di[d];
int jj = j + dj[d];
if(inMat(ii, jj) && v[ii][jj] != '*' && v[ii][jj] != 'D' && matrLee[ii][jj] > matrLee[i][j] + 1) {
matrLee[ii][jj] = matrLee[i][j] + 1;
Q.push({ii, jj});
}
}
}
}
bool valid(int raza) {
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
dist[i][j] = (1 << 30);
}
}
queue<pair<int, int>> Q;
Q.push({is, js});
dist[is][js] = 0;
while(!Q.empty()) {
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for(int d = 0; d < 4; d++) {
int ii = i + di[d];
int jj = j + dj[d];
if(inMat(ii, jj) && v[ii][jj] != '*' && v[ii][jj] != 'D' && dist[ii][jj] > dist[i][j] + 1 &&
matrLee[i][j] >= raza) {
dist[ii][jj] = matrLee[i][j] + 1;
Q.push({ii, jj});
}
}
}
return dist[iF][jF] != (1 << 30);
}
int main() {
fin >> n >> m;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
fin >> v[i][j];
if(v[i][j] == 'I') {
is = i, js = j;
} else if(v[i][j] == 'O') {
iF = i, jF = j;
}
}
}
fin.close();
lee();
int st = 1, dr = matrLee[is][js], ans = -1;
while(st <= dr) {
int mid = (st + dr) / 2;
if(valid(mid)) {
ans = mid;
st = mid + 1;
} else {
dr = mid - 1;
}
}
fout << ans;
return 0;
}