Pagini recente » Cod sursa (job #837643) | Cod sursa (job #2316148) | Cod sursa (job #1552139) | Cod sursa (job #1019184) | Cod sursa (job #1022973)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std ;
#define maxn 1005
#define maxcoada 1000005
#define nrdir 4
const int dx[] = { 1, 0, -1, 0 } ;
const int dy[] = { 0, -1, 0, 1 } ;
int R, C ;
int xs, ys, xi, yi ;
char harta[maxn][maxn] ;
int dist[maxn][maxn], dmax ;
bool ok[maxn][maxn] ;
queue< pair< int, int >> dd ;
queue< pair< int, int >> coada[2 * maxn] ;
void clear_ok()
{
for(int i = 1; i <= R; ++i )
for(int j = 0; j < C; ++j )
ok[i][j] = false ;
}
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
scanf("%d%d\n", &R, &C);
for(int i = 1; i <= R; ++i )
scanf("%s\n", harta[i]);
for(int i = 1; i <= R; ++i )
{
for(int j = 0; j < C; ++j )
{
if( harta[i][j] == 'D' )
dd.push( make_pair( i, j ) ) ;
if( harta[i][j] == 'I' )
xs = i, ys = j ;
if( harta[i][j] == '0' )
xi = i, yi = j ;
}
}
while( dd.empty() == false )
{
int lin = dd.front().first ;
int col = dd.front().second ;
for(int i = 0; i < nrdir; ++i )
{
int xn = lin + dx[i] ;
int yn = col + dy[i] ;
if( xn >= 1 && xn <= R && yn >= 0 && yn < C )
{
if( harta[xn][yn] != '*' && harta[xn][yn] != 'D' )
{
if( dist[xn][yn] == 0 )
{
dist[xn][yn] = dist[lin][col] + 1 ;
dmax = max( dmax, dist[xn][yn] ) ;
dd.push( make_pair( xn, yn ) ) ;
}
}
}
}
dd.pop() ;
}
/*
for(int i = 1; i <= R; ++i )
{
for(int j = 0; j < C; ++j )
printf("%d ", dist[i][j]) ;
printf("\n");
}
*/
for(int i = 1; i <= R; ++i )
for(int j = 0; j < C; ++j )
if( dist[i][j] == dmax )
for(int k = 1; k <= dmax; ++k )
coada[k].push( make_pair( i, j ) ) ;
bool start = false ;
bool stop = false ;
for(int distanta = dmax; distanta > 0; --distanta )
{
while( coada[distanta].empty() == false )
{
int lin = coada[distanta].front().first ;
int col = coada[distanta].front().second ;
ok[lin][col] = true;
for(int i = 0; i < nrdir; ++i )
{
int xn = lin + dx[i] ;
int yn = col + dy[i] ;
if( xn >= 1 && xn <= R && yn >= 0 && yn < C )
{
if( harta[xn][yn] != '*' && harta[xn][yn] != 'D' )
{
if( dist[xn][yn] >= distanta && ok[xn][yn] == false )
{
coada[distanta].push( make_pair( xn, yn ) ) ;
if( xn == xs && yn == ys )
start = true ;
if( xn == xi && yn == yi )
stop = true ;
}
}
}
if( start == true && stop == true )
{
printf("%d\n", distanta);
return 0 ;
}
}
}
}
return 0 ;
}