Pagini recente » Cod sursa (job #1068745) | Cod sursa (job #2955152) | Cod sursa (job #2665698) | Cod sursa (job #264291) | Cod sursa (job #1629814)
#include<fstream>
#include<cstring>
#define DIM 1010
using namespace std;
struct pereche {
int i;
int j;
};
pereche c[DIM * DIM];
char a[DIM][DIM];
int v[DIM][DIM], x[DIM][DIM];
int p, u, iinit, jinit, ifin, jfin, n, m, i, j, iv, jv, d, di[] = {-1,1,0,0}, dj[] = {0,0,-1,1};
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] == 'I') {
iinit = i;
jinit = j;
a[i][j] = '.';
}
if (a[i][j] == 'O') {
ifin = i;
jfin = j;
a[i][j] = '.';
}
if (a[i][j] == 'D') {
u++;
c[u].i = i;
c[u].j = j;
v[i][j] = 1;
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 && a[iv][jv] == '.' && v[iv][jv] == 0) {
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++)
fout<<v[i][j]<<" ";
fout<<"\n";
}
fout.close();
*/
int st = 1;
int dr = v[ c[u].i ][ c[u].j ];
while (st <= dr) {
int mid = (st + dr)/2;
//coada
// pornesc din iinit jinit si mergand doar pe valori din v >= mid caut sa vizitez ifin jfin
int pot = 0;
if (v[iinit][jinit] < mid) {
pot = 0;
} else {
memset(x, 0, sizeof(x));
p = 1;
u = 1;
x[iinit][jinit] = 1;
c[1].i = iinit;
c[1].j = jinit;
while (p <= u && pot == 0) {
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;
}
}
fout<<dr-1;
return 0;
}