Pagini recente » Cod sursa (job #194826) | Cod sursa (job #2305816)
#include <bits/stdc++.h>
#define NMAX 1005
using namespace std;
int distante[NMAX][NMAX],n,m;
int visit[NMAX][NMAX];
pair<int,int> q[NMAX*NMAX],x,y,start,Rodica_Pintea;
int dirCol[] = {0,1,0,-1};
int dirLin[] = {1,0,-1,0};
int verif( int d ) {
int st, dr, i;
memset(visit,0,sizeof(visit));
st = 0;
dr = -1;
q[++dr] = start;
if( d > distante[start.first][start.second] )
return 0;
if( d > distante[Rodica_Pintea.first][Rodica_Pintea.second] )
return 0;
while( st <= dr ) {
x = q[st++];
for( i = 0; i < 4; i ++ ) {
y.first = x.first + dirLin[i];
y.second = x.second + dirCol[i];
if( distante[y.first][y.second] >= d && distante[y.first][y.second] != -2 && distante[y.first][y.second] != 0 && visit[y.first][y.second] == 0 ) {
q[++dr] = y;
visit[y.first][y.second] = 1;
}
}
}
return visit[Rodica_Pintea.first][Rodica_Pintea.second];
}
int main() {
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int i,j,dr,st;
char ch;
scanf("%d%d\n",&n,&m);
st = 0;
dr = -1;
for( i = 1; i <= n; i ++ ) {
for( j = 1; j <= m; j ++ ) {
ch = getc(stdin);
if( ch == '.' )
distante[i][j] = -1;
if( ch == 'D' )
q[++dr].first = i, q[dr].second = j;
if( ch == 'I' )
start.first = i, start.second = j, distante[i][j] = -1;
if( ch == 'O' )
Rodica_Pintea.first = i, Rodica_Pintea.second = j, distante[i][j] = -1;
if( ch == '*' )
distante[i][j] = -2;
}
getc(stdin);
}
while( st <= dr ) {
x = q[st++];
for( i = 0; i < 4; i ++ ) {
y.first = x.first + dirLin[i];
y.second = x.second + dirCol[i];
if( distante[y.first][y.second] == -1 ) {
distante[y.first][y.second] = 1 + distante[x.first][x.second];
q[++dr] = y;
}
}
}
int r,pas;
pas = 1<<21;
r = 1;
while( pas > 1 ) {
pas = pas / 2;
if( r + pas <= distante[start.first][start.second] && verif( r + pas ) == 1 )
r += pas;
}
if( verif(r) == 1 )
printf("%d",r);
else
printf("-1");
return 0;
}