Pagini recente » Cod sursa (job #1652908) | Cod sursa (job #10810) | Cod sursa (job #90574) | Cod sursa (job #2926172) | Cod sursa (job #318307)
Cod sursa(job #318307)
#include<cstdio>
#include<queue>
#define MAXN 1005
using namespace std;
int i , j , N , M , last , A[MAXN][MAXN] , left , right , mid , count ,B[MAXN][MAXN];
int vert[5] = { 0 , 0 , 1 , - 1};
int oriz[5] = { 1 , - 1 , 0 , 0 };
char c;
struct coord {
int x;
int y;
};
coord current , aux , start , end , drag ;
queue <coord> Q;
inline int ok ( coord a ) {
if ( a.x >= 1 && a.x <= N )
{if( a.y >= 1 && a.y <= M )
{ if( A[a.x][a.y] == 0 )
return 1;}}
return 0;
}
void BFS()
{
while ( !Q.empty() )
{
current = Q.front() , Q.pop();
for( i = 0 ; i <= 3 ; ++i)
{
aux.x = current.x + vert[i] , aux.y = current.y + oriz[i];
//count++;
if(ok(aux))
{
A[aux.x][aux.y] = A[current.x][current.y] + 1;
Q.push(aux);
}
}
}
}
int check ( int L )
{
int i , j;
while(!Q.empty())
Q.pop();
if(A[start.x][start.y] < L ) return 0;
for( i = 1 ; i <= N ; i++)
for( j = 1 ; j <= M ; j++)
if(B[i][j] != -1) B[i][j] = 0;
Q.push(start);
B[start.x][start.y] = 1;
while (!Q.empty())
{
current = Q.front() , Q.pop();
B[current.x][current.y] = 1;
if ( current.x == end.x && current.y == end.y ) return 1;
for( i = 0 ; i <= 3 ; ++i ) {
aux.x = current.x + vert[i];
aux.y = current.y + oriz[i];
if ( aux.x >= 1 && aux.x <= N && aux.y >= 1 && aux.y <= M )
{
if(A[aux.x][aux.y] >= L && !B[aux.x][aux.y])
{
B[aux.x][aux.y] = 1;
Q.push(aux);
}
}
}
}
return 0;
}
int main ()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d\n",&N,&M);
for ( i = 1 ; i <= N ; i++) {
for( j = 1 ; j <= M; j++)
{
scanf("%c",&c);
if ( c == 'D' ) {
A[i][j] = 1 ;
drag.x = i;
drag.y = j;
Q.push(drag);
}
else if ( c == '*' ) A[i][j] = -1 , B[i][j] = -1;
else if ( c == 'I' ) start.x = i , start.y = j;
else if ( c == 'O' ) end.x = i , end.y = j;
}
scanf("\n");
}
BFS();
/*
for ( i = 1 ; i <= N ; i ++) {
for( j = 1 ; j <= M ; j++)
printf("%d ",A[i][j]);
printf("\n");
}
*/
left = 1 , right = N * M;
while ( left <= right ) {
mid = ( left + right ) / 2;
if( check(mid) ) last = mid , left = mid + 1;
else right = mid - 1;
}
printf("%d\n",last - 1);
return 0;
}