Pagini recente » Cod sursa (job #1578033) | Cod sursa (job #2945768) | Cod sursa (job #177141) | Cod sursa (job #2980929) | Cod sursa (job #1247292)
#include<fstream>
using namespace std;
int n, m, i, j, p, u, p1, u1, ii, jj, iv, jv, ii1, jj1, ii2, jj2, mid, d;
int a[1002][1002], c[2][1000*1000+1];
char b[1002][1002];
int di[4] = {1, -1, 0, 0};
int dj[4] = {0, 0, 1, -1};
char x;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int main(){
fin>> n >> m;
p = 1;
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
fin>> x;
if(x == 'I'){
ii1 = i;
jj1 = j;
}
else{
if(x == 'O'){
ii2 = i;
jj2 = j;
}
else{
if(x == 'D'){
u++;
c[0][u] = i;
c[1][u] = j;
a[i][j] = 1;
}
else{
if(x == '*'){
a[i][j] = -1;
}
}
}
}
}
}
while(p <= u){
ii = c[0][p];
jj = c[1][p];
for(d = 0; d < 4; d++){
iv = ii + di[d];
jv = jj + dj[d];
if(a[iv][jv] == 0 && iv >= 1 && iv <= n && jv >= 1 && jv <= m){
a[iv][jv] = a[ii][jj] + 1;
u++;
c[0][u] = iv;
c[1][u] = jv;
}
}
p++;
}
p = 1;
if(a[ii1][jj1] < a[ii2][jj2]){
u = a[ii1][jj1] - 1;
}
else{
u = a[ii2][jj2] - 1;
}
while(p <= u){
mid = (p + u) / 2;
p1 = 1;
u1 = 1;
c[0][1] = ii1;
c[1][1] = jj1;
b[ii1][jj1] = 1;
while(p1 <= u1){
ii = c[0][p1];
jj = c[1][p1];
for(d = 0; d < 4; d++){
iv = ii + di[d];
jv = jj + dj[d];
if(a[iv][jv] - 1>= mid && b[iv][jv] == 0){
u1++;
b[iv][jv] = 1;
c[0][u1] = iv;
c[1][u1] = jv;
}
}
p1++;
if(b[ii2][jj2] == 1){
p = mid + 1;
break;
}
}
if(b[ii2][jj2] == 0){
u = mid - 1;
}
for(i = 1; i <= n; i++){
for(j = 1; j <= m; j++){
b[i][j] = 0;
}
}
}
if(u < 1){
fout<< -1;
return 0;
}
fout<< u;
return 0;
}