Pagini recente » Cod sursa (job #2416687) | Cod sursa (job #3289393) | Cod sursa (job #1813241) | Cod sursa (job #49214) | Cod sursa (job #187292)
Cod sursa(job #187292)
#include<stdio.h>
#define nmax 1001
const int x[]={0, 1, -1, 0};
const int y[]={1, 0, 0,-1};
const int mult=100001;
char a[nmax][nmax];
int b[nmax][nmax];
int xi[nmax*nmax];
int yi[nmax*nmax];
int px,py;
int sx,sy;
int R,C,nr;
void afis()
{
int i,j;
for(i=1; i<=R; ++i){
for(j=1; j<=C; ++j)
printf("%d ",b[i][j]);
printf("\n");
}
printf("\n");
}
void lee_dragon(int val)
{
int i,j;
int aux1,aux2;
int aux3,aux4;
int k,inc=1,sf=0;
for(i=1; i<=R; ++i)
for(j=1; j<=C; ++j)
{
b[i][j]=mult;
if( a[i][j]=='D' )
{
b[i][j]=0;
++sf;
xi[sf]=i;
yi[sf]=j;
}
}
//afis();
while( inc<=sf )
{
aux1=xi[inc];
aux2=yi[inc];
for(k=0; k<4; ++k)
{
aux3=aux1+x[k];
aux4=aux2+y[k];
if( aux3 && aux4 && aux3<=R && aux4<=C)
if( a[aux3][aux4]!='*')
if( b[aux3][aux4] > b[aux1][aux2]+1 )
{
b[aux3][aux4]=b[aux1][aux2]+1;
++sf;
xi[sf]=aux3;
yi[sf]=aux4;
}
}
++inc;
}
//printf("(val)%d\n",val);
for(i=1; i<=R; ++i)
for(j=1; j<=C; ++j)
{
if( b[i][j]<val || a[i][j]=='*' )
b[i][j]=666;
else
b[i][j]=1;
}
}
int search_for_the_path()
{
int aux1,aux2;
int aux3,aux4;
int k,inc=1,sf=1;
// printf("%d %d %d %d\n",sx,sy,px,py);
if( b[sx][sy]==666 || b[px][py]==666 )
return 1;
b[px][py]=666;
while( inc<=sf )
{
aux1=xi[inc];
aux2=yi[inc];
for(k=0; k<4; ++k)
{
aux3=aux1+x[k];
aux4=aux2+y[k];
if( aux3>0 && aux4>0 && aux3<=R && aux4<=C)
if( a[aux3][aux4]!='*' && b[aux3][aux4]!=666 )
{
if( aux3==sx && aux4==sy )
return 0;
b[aux3][aux4]=666;
++sf;
xi[sf]=aux3;
yi[sf]=aux4;
}
}
++inc;
}
return 1;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
char aux;
int i,j;
scanf("%d%d",&R,&C);
for(i=1; i<=R; ++i){
for(j=1; j<=C; ++j){
scanf(" %c",&aux);
a[i][j]=aux;
if( aux=='I' ){
px=i;
py=j;
}
else
if( aux=='O' ){
sx=i;
sy=j;
}
}
}
int solfin=-1;
if( a[px][py]=='*' || a[sx][sy]=='D' || a[sx][sy]=='*' || a[px][py]=='D' )
printf("-1\n");
else
{
//afis();
int left=0,right=R*C,val,mij;
while( left<=right )
{
mij=(left+right)>>1;
lee_dragon(mij);
xi[1]=px;
yi[1]=py;
val=search_for_the_path();
if( !val )
solfin=mij,left=mij+1;
else
right=mij-1;
}
printf("%d\n",solfin);
}
return 0;
}