Pagini recente » Cod sursa (job #2339090) | Cod sursa (job #2243508) | Cod sursa (job #1965643) | Cod sursa (job #2454647) | Cod sursa (job #423677)
Cod sursa(job #423677)
#include<stdio.h>
#include<string.h>
struct point
{
int x,y;
};
point p1,p2,q[1000004];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int d[1003][1003],lim;
int viz[1003][1003];
char s[1004][1004];
int n,m,st,dr,inc,sf;
int dfs(int px,int py)
{
int i,sx,sy,sol=0;
viz[px][py]=1;
if(px==p2.x && py==p2.y)
return 1;
for(i=0;i<4;i++)
{
sx=px+dx[i];
sy=py+dy[i];
if(sx<1 || sx>n || sy<0 || sy>=m)
continue;
if(d[sx][sy]<lim)
continue;
if(viz[sx][sy])
continue;
sol|=dfs(sx,sy);
}
return sol;
}
int main ()
{
int i,j,px,py,sx,sy,r;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&n,&m);
for(i=1;i<=n;i++)
scanf("%s",s[i]);
for(i=1;i<=n;i++)
for(j=0;j<m;j++)
{
if(s[i][j]=='D')
{
q[++sf].x=i;
q[sf].y=j;
viz[i][j]=1;
}
if(s[i][j]=='I')
p1.x=i,p1.y=j;
if(s[i][j]=='0')
p2.x=i,p2.y=j;
}
//citire
inc=1;
while(inc<=sf)
{
px=q[inc].x;
py=q[inc].y;
if(d[px][py]>dr)
dr=d[px][py];
for(i=0;i<4;i++)
{
sx=px+dx[i];
sy=py+dy[i];
if(sx<1 || sx>n || sy<0 || sy>=m)
continue;
if(s[sx][sy]=='*')
continue;
if(!viz[sx][sy])
{
viz[sx][sy]=1;
d[sx][sy]=d[px][py]+1;
q[++sf].x=sx;
q[sf].y=sy;
}
}
inc++;
}
//bfs
st=1;
while(st<=dr)
{
lim=(st+dr)/2;
if(d[p1.x][p1.y]<lim)
{
dr=lim-1;
continue;
}
memset(viz,0,sizeof(viz));
r=dfs(p1.x,p1.y);
if(r)
st=lim+1;
else
dr=lim-1;
}
//cautare binara+dfs
if(!dr)
printf("-1\n");
else
printf("%d\n",dr);
return 0;
}