Pagini recente » Cod sursa (job #937577) | Cod sursa (job #895190) | Cod sursa (job #474290) | Cod sursa (job #5277) | Cod sursa (job #1745034)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#define BORDER -2
#define UNUSED 1000000000
#define lin dragon[0].x
#define col dragon[0].y
#define dist dragon[0].d
#define L carare[0].x
#define C carare[0].y
struct date
{
int x;
int y;
int d;
};
struct date Zona( int l, int c, int d )
{
struct date zona;
zona.x=l;
zona.y=c;
zona.d=d;
return zona;
}
struct date Zona( int l, int c )
{
struct date zona;
zona.x=l;
zona.y=c;
zona.d=0;
return zona;
}
std::deque<struct date> dragon;
int mat[1005][1005], cpy[1005][1005];
int dl[5]={ -1, 0, 1, 0 };
int dc[5]={ 0, 1, 0, -1 };
using namespace std;
int cale( int k, int il, int ic, int ol, int oc )
{
deque<struct date>carare;
int i;
memcpy(cpy,mat,sizeof(cpy));
carare.push_back(Zona(il,ic));
while( carare.size() && (L!=ol || C!=oc) )
{
if( cpy[L][C]!=BORDER && cpy[L][C]>=k )
{
for( i=0;i<4;i++ )
carare.push_back(Zona(L+dl[i],C+dc[i]));
}
cpy[L][C]=BORDER;
carare.pop_front();
}
return carare.size()>0;
}
int main()
{
freopen( "barbar.in", "r", stdin );
freopen( "barbar.out", "w", stdout );
int n, m, il, ic, ol, oc, pas, i, j;
char k;
scanf( "%d%d\n", &n, &m );
for( i=1;i<=n;i++ )
{
for( j=1;j<=m;j++ )
{
scanf( "%c", &k );
mat[i][j]=UNUSED;
if( k=='I' )
{
il=i;
ic=j;
}
else
if( k=='O' )
{
ol=i;
oc=j;
}
else
if( k=='D' )
{
dragon.push_back(Zona(i,j,0));
}
else
if( k=='*' )
{
mat[i][j]=BORDER;
}
}
scanf( "\n" );
}
for( i=0;i<=n+1;i++ )
{
mat[i][0]=BORDER;
mat[i][m+1]=BORDER;
}
for( j=0;j<=m+1;j++ )
{
mat[0][j]=BORDER;
mat[n+1][j]=BORDER;
}
while( dragon.size() )
{
if( mat[lin][col]==UNUSED )
{
for( i=0;i<4;i++ )
dragon.push_back(Zona(lin+dl[i],col+dc[i],dist+1));
mat[lin][col]=dist;
}
dragon.pop_front();
}
i=-1;
for( pas=(1<<20); pas>0; pas>>=1 )
if( cale(pas+i,il,ic,ol,oc)==1 )
i+=pas;
printf( "%d", i );
return 0;
}