Pagini recente » Cod sursa (job #386711) | Cod sursa (job #2482575) | Cod sursa (job #12618) | Cod sursa (job #1726781) | Cod sursa (job #343459)
Cod sursa(job #343459)
#include<cstdio>
struct poz
{
int lin,col;
};
const int N = (1<<10);
const int dlin[]={-1,0,1,0};
const int dcol[]={0,1,0,-1};
char a[N][N];
int d[N][N],r,c;
poz q[N*N],st,fi;
void citire()
{
int i;
scanf("%d%d\n",&r,&c);
for(i=1 ; i<=r ; ++i)
fgets(1+a[i],N,stdin);
}
void CL_dragoni()
{
int i,j,k,p=1,u=0;
poz x,y;
for(i=1 ; i<=r ; ++i)
for(j=1 ; j<=c ; ++j)
{
if(a[i][j]=='I')
st=(poz){i,j};
if(a[i][j]=='O')
fi=(poz){i,j};
if(a[i][j]=='D')
q[++u]=(poz){i,j};
}
while(p<=u)
{
x=q[p++];
for(k=0 ; k<4 ; ++k)
{
y=(poz){x.lin+dlin[k],x.col+dcol[k]};
i=y.lin;
j=y.col;
if((a[i][j]=='.' || a[i][j]=='I' || a[i][j]=='O') && d[i][j]==0)
{
d[i][j]=1+d[x.lin][x.col];
q[++u]=(poz){i,j};
}
}
}
}
bool CL(int val)
{
bool b[N][N]={false};
int i,j,k,p=1,u=0;
poz x,y;
if(d[st.lin][st.col]<val)
return false;
b[st.lin][st.col]=true;
q[++u]=(poz){st.lin,st.col};
while(p<=u)
{
x=q[p++];
for(k=0 ; k<4 ; ++k)
{
y=(poz){x.lin+dlin[k],x.col+dcol[k]};
i=y.lin;
j=y.col;
if((a[i][j]=='.' || a[i][j]=='O') && !b[i][j] && d[i][j]>=val)
{
b[i][j]=true;
q[++u]=(poz){i,j};
}
}
}
return b[fi.lin][fi.col];
}
int caut()
{
int i,pas=N>>1;
for(i=1 ; pas ; pas>>=1)
if(i+pas<=r && i+pas<=c && CL(i+pas))
i+=pas;
return i;
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
citire();
CL_dragoni();
printf("%d\n",caut());
return 0;
}