Pagini recente » Cod sursa (job #1855541) | Cod sursa (job #2043069) | Cod sursa (job #2465180) | Cod sursa (job #538261) | Cod sursa (job #186265)
Cod sursa(job #186265)
#include <stdio.h>
#define SI 1000000
#define Nmax 1011
int b[Nmax][Nmax];
int a[Nmax][Nmax];
struct punct{int c1,c2;};
punct plec,sos;
short int va[Nmax*Nmax];
short int vb[Nmax*Nmax];
int nrv;
const int lin[]={0,1,0,-1};
const int col[]={1,0,-1,0};
int rez,R,C;
inline int minim(int x,int y)
{
if(x<y)
return x;
return y;
}
void read()
{
char ch;
freopen("barbar.in", "r",stdin);
freopen("barbar.out", "w",stdout);
scanf("%d%d", &R,&C);
for(int i=1;i<=R;++i)
{
scanf("%c", &ch);
for(int j=1;j<=C;++j)
{
scanf("%c", &ch);
a[i][j]=SI;
if(ch=='I')
{
plec.c1=i;
plec.c2=j;
}
if(ch=='O')
{
sos.c1=i;
sos.c2=j;
}
if(ch=='*')
a[i][j]=-1;
if(ch=='D')
{
a[i][j]=0;
va[++nrv]=i;
vb[nrv]=j;
}
}
}
}
void lee(int x,int y)
{
for(int t=0;t<4;t++)
if((a[x+lin[t]][y+col[t]]>a[x][y]+1))
{
a[x+lin[t]][y+col[t]]=a[x][y]+1;
va[++nrv]=x+lin[t];
vb[nrv]=y+col[t];
}
}
inline int ok(int xx,int yy)
{
if(xx<=R && xx>=1 && yy<=C && yy>=1)
return 1;
return 0;
}
/*void fill(int x,int y,int dist)
{
for(int t=0;t<4;t++)
if(a[x+lin[t]][y+col[t]]>=z && a[x+lin[t]][y+col[t]]!=-1 && ok(x+lin[t],y+col[t]) && b[x+lin[t]][y+col[t]]!=dist)
{
b[x+lin[t]][y+col[t]]=dist;
va[++nrv]=x+lin[t];
vb[nrv]=y+col[t];
}
}*/
inline int verifica(int dist)
{
int p=1,x,y;
nrv=1;
va[1]=plec.c1;
vb[1]=plec.c2;
if(!dist)
for(int i=1;i<=R;++i)
for(int j=1;j<=C;++j)
b[i][j]=1;
while(p<=nrv)
{
for(int i=0;i<4;i++)
{
x=va[p]+lin[i];
y=vb[p]+col[i];
if(a[x][y]>=dist && b[x][y]!=dist)
{
if(x==sos.c1 && y==sos.c2)
return 1;
va[++nrv]=x;
vb[nrv]=y;
b[x][y]=dist;
}
}
++p;
}
/*for(int i=1;i<=R;++i)
{
printf("\n");
for(int j=1;j<=C;++j)
printf("%d ",b[i][j]);
}
printf("\n");*/
return 0;
}
void make_lee()
{
for(int i=1;i<=nrv;i++)
lee(va[i],vb[i]);
//int m,u=0,p=1000000;
/*while(u<=p)
{
m=(u+p)/2;
if(verifica(m) )
if(!verifica(m+1))
{
printf("%d\n",m);
return;
}
else
u=m+1;
else
p=m-1;
}*/
for(int k=100000;k>=1;--k)
if(verifica(k) )
{
printf("%d\n", k);
return;
}
printf("-1");
}
int main()
{
read();
make_lee();
return 0;
}