Pagini recente » Cod sursa (job #1316266) | Cod sursa (job #595289) | Cod sursa (job #887708) | Cod sursa (job #2924354) | Cod sursa (job #187283)
Cod sursa(job #187283)
#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 c[nmax][nmax];
int pdx[nmax];
int pdy[nmax];
int xi[nmax*nmax];
int yi[nmax*nmax];
int px,py;
int sx,sy;
int R,C;
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 nr)
{
int aux1,aux2;
int aux3,aux4;
int i,j,inc,sf;
for(int k=1; k<=nr; ++k){
inc=1,sf=1;
xi[1]=pdx[k];
yi[1]=pdy[k];
b[xi[1]][yi[1]]=0;
while( inc<=sf )
{
aux1=xi[inc],aux2=yi[inc];
++inc;
for(i=0; i<4; ++i)
{
aux3=aux1+x[i];
aux4=aux2+y[i];
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;
xi[++sf]=aux3;
yi[sf]=aux4;
}
}
}
}
}
int search_for_the_path(int val)
{
int inc=1,sf=1;
int aux1,aux2;
int aux3,aux4;
int k;
if( b[ xi[1] ][ yi[1] ]<val )
return 1;
while( inc<=sf )
{
aux1=xi[inc];
aux2=yi[inc];
++inc;
c[aux1][aux2]=val;
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]!='*')
if( b[aux3][aux4]>=val && c[aux3][aux4]!=val)
{
if( aux3 == sx && aux4 == sy )
return 0;
c[aux3][aux4]=val;
++sf;
xi[sf]=aux3;
yi[sf]=aux4;
}
}
}
return 1;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
char aux;
int nr=0,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;
b[i][j]=mult;
c[i][j]=mult;
if( aux=='D' ){
pdx[++nr]=i;
pdy[nr]=j;
}
else
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
{
lee_dragon(nr);
//afis();
int left=0,right=R*C,val;
int pos;
while( left<=right )
{
xi[1]=px;
yi[1]=py;
// printf("%d %d\n",left,right);
val=(left+right)>>1;
pos=search_for_the_path(val);
//printf("am incercat cu %d \n",val);
if( !pos )
solfin=val,left=val+1;//printf("si a iesit bini %d\n",solfin);
//val va fi tot timpul cea mai varianta pt solfin
else
right=val-1;
}
printf("%d\n",solfin);
}
return 0;
}