Pagini recente » Cod sursa (job #2171389) | Cod sursa (job #275053) | Cod sursa (job #2742044) | Cod sursa (job #578918) | Cod sursa (job #2783875)
#include <fstream>
#include <queue>
#define NMAX 1000
using namespace std;
ifstream cin ("barbar.in");
ofstream cout ("barbar.out");
queue < pair <int, int> > myqueue;
int n, m, linit, cinit, lfinish, cfinish;
int vdist[NMAX + 3][NMAX + 3];
bool fmat[NMAX + 3][NMAX + 3];
char mat[NMAX + 3][NMAX + 3];
int dlin[] = {1, 0, 0, -1};
int dcol[] = {0, 1, -1, 0};
char get_next() {
char ch;
ch = cin.get();
while (!(ch == '*' || ch == 'I' || ch == 'D' || ch == 'O' || ch == '.'))
ch = cin.get();
return ch;
}
void bfs() {
int i, j, lin, col, dir, dist, newlin, newcol;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
if (mat[i][j] == 'D') {
myqueue.push(pair<int, int>(i, j));
vdist[i][j] = 0;
}
while (!myqueue.empty()) {
lin = myqueue.front().first; col = myqueue.front().second; dist = vdist[lin][col];
for (dir = 0; dir < 4;dir++) {
newlin = lin + dlin[dir];
newcol = col + dcol[dir];
if (mat[newlin][newcol] != '*' && vdist[newlin][newcol] == -1) {
vdist[newlin][newcol] = dist + 1;
myqueue.push(pair<int, int>(newlin, newcol));
}
}
myqueue.pop();
}
}
void dfs(int lin, int col, int dist) {
int dir, newlin, newcol;
fmat[lin][col] = 1;
for (dir = 0; dir < 4; dir++) {
newlin = lin + dlin[dir];
newcol = col + dcol[dir];
if (fmat[newlin][newcol] == 0 && mat[newlin][newcol] != '*' && vdist[newlin][newcol] >= dist)
dfs(newlin, newcol, dist);
}
}
int test(int min_dist) {
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
fmat[i][j] = 0;
dfs(linit, cinit, min_dist);
if (fmat[lfinish][cfinish] == 1)
return 1;
return 0;
}
int bs(int st, int dr) {
int mij, sol;
sol = -1;
while (st <= dr) {
mij = (st + dr) / 2;
if (test(mij)) {
st = mij + 1;
sol = mij;
}
else
dr = mij - 1;
}
return sol;
}
void init_mats() {
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
vdist[i][j] = -1;
for (i = 0; i <= n + 1; i++)
mat[i][0] = mat[i][m + 1] = '*';
for (j = 0; j <= m + 1; j++)
mat[0][j] = mat[0][n + 1] = '*';
}
int main(){
int i, j;
cin >> n >> m;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++ ) {
mat[i][j] = get_next();
if (mat[i][j] == 'I')
linit = i, cinit = j;
else if (mat[i][j] == 'O')
lfinish = i, cfinish = j;
}
}
init_mats();
bfs();
cout << bs(0, vdist[linit][cinit]);
return 0;
}