Pagini recente » Cod sursa (job #750004) | Cod sursa (job #425991) | Cod sursa (job #2577180) | Cod sursa (job #220880) | Cod sursa (job #76369)
Cod sursa(job #76369)
#include <stdio.h>
#define DIM 1001
int R, C, temn[ DIM ][ DIM ], viz[ DIM ][ DIM ];
int coada[ DIM * DIM ][ 2 ], dimc;
int startx, starty, stopx, stopy;
void readinput( void )
{
int i, j;
char ch;
FILE *in = fopen( "barbar.in" , "rt" );
fscanf( in, "%d%d%c", &R, &C, &ch);
for( i = 0; i < R; i++ )
{
for( j = 0; j < C; j++ )
{
fscanf( in, "%c", &ch );
switch ( ch ) {
case '.': temn[ i ][ j ] = 0; break;
case '*': temn[ i ][ j ] = -1; break;
case 'D': {
coada[ dimc ][ 0 ] = i;
coada[ dimc++ ][ 1 ] = j;
temn[ i ][ j ] = -2;
} break;
case 'I': {
startx = i;
starty = j;
temn[ i ][ j ] = 0;
} break;
case 'O': {
stopx = i;
stopy = j;
temn[ i ][ j ] = 0;
}
}
}
fscanf( in, "%c", &ch);
}
fclose( in );
}
const int dx[ 4 ] = { 0, 0, -1, 1 },
dy[ 4 ] = { -1, 1, 0, 0 };
int maxd, mind = 5 * DIM;
void bf( void )
{
int i = 0, j = dimc, k, x, y;
while( i < j )
{
x = coada[ i ][ 0 ];
y = coada[ i ][ 1 ];
for( k = 0; k < 4; k++ )
if( x + dx[k] >= 0 && x + dx[k] < R &&
y + dy[k] >= 0 && y + dy[k] < C &&
!temn[ x + dx[k] ][ y + dy[k] ] )
{
if( i < dimc )
temn[ x + dx[k] ][ y + dy[k] ] = 1;
else
temn[ x + dx[k] ][ y + dy[k] ] = temn[ x ][ y ] + 1;
coada[ j ][ 0 ] = x + dx[k];
coada[ j++ ][ 1 ] = y + dy[k];
if( temn[ x + dx[k] ][ y + dy[k] ] > maxd )
maxd = temn[ x + dx[k] ][ y + dy[k] ];
}
i++;
}
}
void clearviz( void )
{
int i, j;
for( i = 0; i < R; i++ )
for( j = 0; j < C; j++ )
viz[ i ][ j ] = 0;
}
int dfs( int kx, int ky, int bord )
{
int k;
if( kx == stopx && ky == stopy ) return 1;
viz[ kx ][ ky ] = 1;
for( k = 0; k < 4; k++ )
if( kx + dx[k] >= 0 && kx + dx[k] < R &&
ky + dy[k] >= 0 && ky + dy[k] < C &&
!viz[ kx + dx[k] ][ ky + dy[k] ] &&
temn[ kx + dx[k] ][ ky + dy[k] ] >= bord )
if( dfs( kx + dx[k], ky + dy[k],bord ) )
return 1;
return 0;
}
int rez = -1;
void go( void )
{
mind = 0;
while( mind <= maxd )
{
clearviz();
if( dfs( startx, starty, ( mind + maxd ) / 2 ) )
{
rez = ( mind + maxd ) / 2;
mind = ( mind + maxd ) / 2 + 1;
}
else maxd = ( mind + maxd ) / 2 - 1;
}
}
void writeoutput( void )
{
FILE *out = fopen( "barbar.out", "wt" );
fprintf( out, "%d", rez );
fclose( out );
}
int main()
{
readinput();
bf();
go();
writeoutput();
return 0;
}