Pagini recente » Cod sursa (job #551752) | Cod sursa (job #1092625) | Cod sursa (job #1622931) | Cod sursa (job #43364) | Cod sursa (job #1771733)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1.e3;
struct POZ{
int x, y;
};
struct BARBAR{
int x, y, val;
};
deque<BARBAR>d;
int dmin[NMAX + 5][NMAX + 5];
int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};
int main(){
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
int r, c, i, j;
char car;
POZ begin, end;
BARBAR n1, n2;
scanf("%d %d", &r, &c);
for (i = 1; i <= r; i ++){
getc(stdin);
for (j = 1; j <= c; j ++){
car = getc(stdin);
switch (car){
case 'I': {dmin[i][j] = -1; begin.x = i; begin.y = j; break;}
case 'O': {dmin[i][j] = -1; end.x = i; end.y = j; break;}
case 'D': {n1.x = i; n1.y = j; n1.val = 0; d.push_back(n1); break;}
case '.': {dmin[i][j] = -1; break;}
}
}
}
do{
n1 = d.front();
d.pop_front();
dmin[n1.x][n1.y] = n1.val;
for (i = 0; i < 4; i ++){
n2.x = n1.x + dx[i];
n2.y = n1.y + dy[i];
n2.val = n1.val + 1;
if (dmin[n2.x][n2.y] == -1){
dmin[n2.x][n2.y] = 0;
d.push_back(n2);
}
}
}while(d.size());
n1.x = begin.x;
n1.y = begin.y;
n1.val = dmin[begin.x][begin.y];
d.push_back(n1);
do{
n1 = d.front();
d.pop_front();
for (i = 0; i < 4; i ++){
n2.x = n1.x + dx[i];
n2.y = n1.y + dy[i];
if (dmin[n2.x][n2.y] > 0){
if (dmin[n2.x][n2.y] >= n1.val){
n2.val = n1.val;
d.push_front(n2);
}else{
n2.val = dmin[n2.x][n2.y];
d.push_back(n2);
}
}
dmin[n2.x][n2.y] = -1;
}
}while((n1.x != end.x || n1.y != end.y) && d.size() > 0);
if (n1.x == end.x && n1.y == end.y)
printf("%d\n", n1.val);
else
printf("-1\n");
return 0;
}