Pagini recente » Cod sursa (job #2742780) | Cod sursa (job #231349) | Cod sursa (job #1505356) | Cod sursa (job #2960136) | Cod sursa (job #420414)
Cod sursa(job #420414)
#include <stdio.h>
#define Nmax 1024
int viz[Nmax][Nmax],ver[Nmax][Nmax],n,m,dx[4]={-1,0,0,1},dy[4]={0,-1,1,0},st,dr,sl,sc,fl,fc,fin;
char a[Nmax][Nmax];
struct coada{
int x,y;
};
coada q[Nmax*Nmax];
int verifica(int mid)
{
int i,j,stanga=0,dreapta=0;
if(viz[sl][sc]>=mid)
{
q[++dreapta].x=sl;
q[dreapta].y=sc;
}
else
return 0;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(a[i][j]=='.')
ver[i][j]=0;
else
ver[i][j]=1;
ver[fl][fc]=0;
while(stanga<dreapta)
{
++stanga;
int x=q[stanga].x;
int y=q[stanga].y;
for(i=0;i<4;++i)
if(viz[x+dx[i]][y+dy[i]]>=mid && !ver[x+dx[i]][y+dy[i]])
{
q[++dreapta].x=x+dx[i];
q[dreapta].y=y+dy[i];
ver[x+dx[i]][y+dy[i]]=1;
}
}
/* for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
printf("%d",ver[i][j]);
printf("\n");
}*/
if(ver[fl][fc])
return 1;
return 0;
}
int main()
{
int i,j;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='D')
{
viz[i][j]=1;
q[++dr].x=i;
q[dr].y=j;
}
else
if(a[i][j]=='*')
viz[i][j]=-1;
else
if(a[i][j]=='I')
{
sl=i;
sc=j;
}
else
if(a[i][j]=='O')
{
fl=i;
fc=j;
}
}
scanf("\n");
}
for(i=1;i<=n;++i)
viz[i][0]=viz[i][m+1]=ver[i][0]=ver[i][m+1]=1;
for(i=1;i<=m;++i)
viz[0][i]=viz[n+1][i]=ver[0][i]=ver[n+1][i]=1;
while(st<dr)
{
++st;
int x=q[st].x;
int y=q[st].y;
for(i=0;i<4;++i)
if(!viz[x+dx[i]][y+dy[i]])
{
viz[x+dx[i]][y+dy[i]]=viz[x][y]+1;
q[++dr].x=x+dx[i];
q[dr].y=y+dy[i];
}
}
/* for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
if(viz[i][j])
--viz[i][j];*/
/* for(i=1;i<=n;++i)
{
for(j=1;j<=m;++j)
printf("%d",viz[i][j]);
printf("\n");
}*/
st=2;
dr=n+m;
while(st<=dr)
{
int mid=(st+dr)>>1;
int ok =verifica(mid);
if(ok)
{
fin=mid;
st=mid+1;
}
else
dr=mid-1;
}
printf("%d\n",fin-1);
return 0;
}