Pagini recente » Cod sursa (job #1536804) | Cod sursa (job #1577888) | Cod sursa (job #396092) | Cod sursa (job #1556505) | Cod sursa (job #1629622)
#include <fstream>
#include <cstring>
#define DIM 1010
using namespace std;
struct pereche {
int i;
int j;
};
char a[DIM][DIM];
int v[DIM][DIM];
pereche c[DIM*DIM];
int p, u, i, j, n, m, ifin, jfin, iinit, jinit, d, iv, jv, di[] = {-1,1,0,0}, dj[] = {0,0,-1,1};
int x[DIM][DIM];
int main () {
ifstream fin ("barbar.in");
ofstream fout("barbar.out");
fin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++) {
fin>>a[i][j];
if (a[i][j] == 'D') {
u++;
c[u].i = i;
c[u].j = j;
v[i][j] = 1;
a[i][j] = '.';
}
if (a[i][j] == 'I') {
iinit = i;
jinit = j;
a[i][j] = '.';
}
if (a[i][j] == 'O') {
ifin = i;
jfin = j;
a[i][j] = '.';
}
}
p = 1;
while (p <= u) {
for (d = 0; d <= 3; d++) {
iv = c[p].i + di[d];
jv = c[p].j + dj[d];
if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && v[iv][jv] == 0 && a[iv][jv] != '*'){
u++;
c[u].i = iv;
c[u].j = jv;
v[iv][jv] = 1 + v[ c[p].i ][ c[p].j ];
}
}
p++;
}
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
if (a[i][j] == '*')
v[i][j] = -1;
/*
for (i=1;i<=n;i++) {
for (j=1;j<=m;j++)
fout<<v[i][j]<<" ";
fout<<"\n";
}
*/
int st = 0, pot;
int dr = v[ c[u].i ][ c[u].j ];
while (st <= dr) {
int mid = (st + dr)/2;
// pornesc din iinit, jinit si incerc sa ating ifin, jfin vizitand doar elemente
// din v cu valori >= mid
if (v[ iinit ][jinit] < mid)
pot = 0;
else {
pot = 0;
p = 1;
u = 1;
c[1].i = iinit;
c[1].j = jinit;
memset(x, 0, sizeof(x));
x[iinit][jinit] = 1;
while (p <= u && !pot) {
for (d = 0;d <= 3; d++) {
iv = c[p].i + di[d];
jv = c[p].j + dj[d];
if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && v[iv][jv] >= mid && x[iv][jv] == 0) {
u++;
c[u].i = iv;
c[u].j = jv;
x[iv][jv] = 1;
if (iv == ifin && jv == jfin) {
pot = 1;
break;
}
}
}
p++;
}
}
if (pot) {
st = mid + 1;
} else {
dr = mid - 1;
}
}
if (dr - 1 >= 0)
fout<<dr-1<<"\n";
else
fout<<-1;
return 0;
}