Pagini recente » Cod sursa (job #1633851) | Cod sursa (job #1625180) | Cod sursa (job #2621042) | Cod sursa (job #1498668) | Cod sursa (job #467563)
Cod sursa(job #467563)
#include<stdio.h>
#include<string>
FILE*f=fopen("barbar.in","r");
FILE*g=fopen("barbar.out","w");
int min ( int a, int b ){
if ( a > b )
return b;
return a;
}
int n,m,b[1005][1005],i,j,ii,xfin,yfin,xinit,yinit,p,u,mij;
char a[1005][1005];
int c[2][1005*1005];
int di[4] = {1,-1,0,0};
int dj[4] = {0,0,1,-1};
int coada ( int x ) {
int p,u,ic,jc,iv,jv;
int d;
char viz[1005][1005];
memset(viz,0,sizeof(viz));
c[0][1] = xinit; c[1][1] = yinit;
p = u = 1 ;
while ( p <= u ){
ic = c[0][p]; jc = c[1][p];
for ( d = 0 ; d <= 3 ; ++d ){
iv = ic + di[d]; jv = jc + dj[d];
if( iv >= 1 && iv <= n && jv >= 1 && jv <= m && viz[iv][jv] == 0 && a[iv][jv] == '.' && (b[iv][jv] == 2000 || b[iv][jv] <= x ) ){
++u ;
c[0][u] = iv ; c[1][u] = jv ;
viz[iv][jv] = 1 ;
if ( iv == xfin && jv == yfin && (b[iv][jv] == 2000 || b[iv][jv] <= x ) )
return 1;
}
}
++p;
}
return 0;
}
int main () {
fscanf(f,"%d %d\n",&n,&m);
for ( i = 1 ; i <= n ; ++i )
for ( j = 1 ; j <= m ; ++j )
b[i][j] = 2000 ;
for ( i = 1 ; i <= n ; ++i ){
fscanf( f,"%s",a[i] + 1 ) ;
for ( j = 1 ; j <= m ; ++j ){
if ( a[i][j] == 'I' ){
xinit = i ; yinit = j ;
continue;
}
if ( a[i][j] == 'D' ){
for ( ii = i ; ii <= n ; ++ii )
b[ii][j] = min ( b[ii][j] , ii - i ) ;
for ( ii = i ; ii >= 1 ; ii -- )
b[ii][j] = min ( b[ii][j] , i - ii ) ;
for ( ii = j ; ii <= m ; ii ++ )
b[i][ii] = min ( b[i][ii] , ii - j ) ;
for ( ii = j ; ii >= 1 ; ii -- )
b[i][ii] = min ( b[i][ii] , j - ii ) ;
continue;
}
if ( a[i][j] == 'O' )
xfin = i ; yfin = j ;
}
}
p = 1 ;
if ( n > m )
u = n ;
else
u = m ;
while ( p <= u ){
mij = p + (u - p ) / 2 ;
// coada(x) == 1 daca poate traversa trecand doar cu distanta <= x
if ( coada(mij) == 1 )
u = mij - 1 ;
else
p = mij + 1 ;
}
if( u == 0 )
fprintf( g, "-1\n" ) ;
else
fprintf(g,"%d\n",u);
fclose(f);
fclose(g);
return 0;
}