Pagini recente » Cod sursa (job #546184) | Cod sursa (job #2588395) | Cod sursa (job #1252700) | Cod sursa (job #1555164) | Cod sursa (job #1334321)
#include <fstream>
#include <cstring>
#define DIM 1001
using namespace std;
ifstream fin ("barbar.in" );
ofstream fout("barbar.out");
int istart, jstart, ifinish, jfinish;
int N, M, i, j, k, ok, jj, ii, p, u;
int A[DIM][DIM], B[DIM][DIM], a, b;
int C[3][DIM*DIM], ic, jc, iv, jv, d;
int diri[5] = {0,-1, 0, 1, 0};
int dirj[5] = {0, 0, 1, 0,-1};
int mid;
char x;
void SetUp(){
fin >> N >> M;
for(i = 1; i <= N; i ++)
for(j = 1; j <= M; j ++){
fin >> x;
if(x == 'I'){
istart = i;
jstart = j;
A[i][j] =-2;
}
if(x == 'O'){
ifinish = i;
jfinish = j;
A[i][j] =-2;
}
if(x == 'D'){
u ++;
C[1][u] = i;
C[2][u] = j;
A[i][j] = 0;
}
if(x == '*')
A[i][j] =-1;
if(x == '.')
A[i][j] =-2;
}
return;
}
void BFS_1(){
p = 1;
while(p <= u){
ic = C[1][p];
jc = C[2][p];
for(d = 1; d <= 4; d ++){
iv = ic + diri[d];
jv = jc + dirj[d];
if(iv >= 1 && iv <= N)
if(jv >= 1 && jv <= M)
if(A[iv][jv] == -2){
u ++;
C[1][u] = iv;
C[2][u] = jv;
A[iv][jv] = A[ic][jc] + 1;
}
}
p ++;
}
return;
}
void BFS_2(){
a = 0; b = A[istart][jstart];
if(b > A[ifinish][jfinish])
b = A[ifinish][jfinish];
memset(C[1], 0, sizeof(C[1]));
memset(C[2], 0, sizeof(C[2]));
while(a <= b){
p = 1; u = 1;
mid = (a+b)/2;
C[1][u] = istart;
C[2][u] = jstart;
B[istart][jstart] = 1;
while(p <= u){
ic = C[1][p];
jc = C[2][p];
for(d = 1; d <= 4; d ++){
iv = ic + diri[d];
jv = jc + dirj[d];
if(iv >= 1 && iv <= N)
if(jv >= 1 && jv <= M)
if(A[iv][jv] >= mid)
if(B[iv][jv] == 0){
u ++;
C[1][u] = iv;
C[2][u] = jv;
B[iv][jv] =1;
}
}
if(B[ifinish][jfinish] == 1)
break;
p ++;
}
if(p <= u)
a = mid + 1;
else
b = mid - 1;
for(i = 1; i <= N; i ++)
for(j = 1; j <= M; j ++)
B[i][j] = 0;
}
if(A[ifinish][jfinish] == -2)
fout << -1;
else
fout << b;
return;
}
int main(){
SetUp();
BFS_1();
BFS_2();
return 0;
}