Pagini recente » Cod sursa (job #1878666) | Cod sursa (job #425425) | Cod sursa (job #1539800) | Cod sursa (job #2203458) | Cod sursa (job #2201229)
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define DM 1001
int r, c;
char mat[DM][DM];
queue < pair < int, int > > lee1, lee2;
pair < int, int > sp, fp;
int dmin[DM][DM], xpath[DM][DM];
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};
bool inside(int i, int j) {
return(i >= 1 && i <= r && j >= 1 && j <= c);
}
void putzero() {
for(int i = 1; i <= r; i++) {
for(int j = 1; j <= c; j++) {
xpath[i][j] = 0;
}
}
}
bool verifbin(int x) {
lee2.push(make_pair(sp.first, sp.second));
while(!lee2.empty()) {
int nodi = lee2.front().first;
int nodj = lee2.front().second;
lee2.pop();
for(int i = 0; i < 4; i++) {
int newi = nodi + di[i];
int newj = nodj + dj[i];
if(inside(newi, newj) && mat[newi][newj] != '*' && !xpath[newi][newj] && dmin[newi][newj] >= x) {
xpath[newi][newj] = xpath[nodi][nodj] + 1;
lee2.push(make_pair(newi, newj));
}
}
}
if(xpath[fp.first][fp.second])
return true;
return false;
}
int bin() {
int lo = -1, hi = r * c, mid;
while(lo <= hi) {
mid = (lo + hi) / 2;
if(verifbin(mid) && xpath[fp.first][fp.second] >= mid) {
lo = mid + 1;
} else {
hi = mid - 1;
}
putzero();
}
if(verifbin(hi))
return hi;
return -1;
}
int main() {
fin >> r >> c;
fin.get();
for(int i = 1; i <= r; i++)
fin.getline(mat[i] + 1, DM);
for(int i = 1; i <= r; i++) {
for(int j = 1; j <= c; j++) {
if(mat[i][j] == 'I') {
sp.first = i;
sp.second = j;
} else if(mat[i][j] == 'O') {
fp.first = i;
fp.second = j;
} else if(mat[i][j] == 'D')
lee1.push(make_pair(i, j));
}
}
while(!lee1.empty()) {
int nodi = lee1.front().first;
int nodj = lee1.front().second;
lee1.pop();
for(int i = 0; i < 4; i++) {
int newi = nodi + di[i];
int newj = nodj + dj[i];
if(inside(newi, newj) && mat[newi][newj] != '*' && mat[newi][newj] != 'D' && !dmin[newi][newj]) {
dmin[newi][newj] = dmin[nodi][nodj] + 1;
lee1.push(make_pair(newi, newj));
}
}
}
int rez = bin();
if(verifbin(rez))
fout << rez;
else
fout << "-1";
}