Pagini recente » Cod sursa (job #2261061) | Cod sursa (job #1811368) | Borderou de evaluare (job #702925) | Cod sursa (job #330307) | Cod sursa (job #184332)
Cod sursa(job #184332)
#include<stdio.h>
int a[1005][1005],b[1005][1005],r,c,ok;
const int dx[]={0,1,0,-1};
const int dy[]={1,0,-1,0};
struct cod
{
int y,x;
};
int inc,sf=-1;
cod k1,k2,now,next,co[1000010];
void citeste()
{
int i,j;
char aux;
for(i=0; i<=r+1; i++)
a[i][0]=a[i][c+1]=-2;
for(i=0; i<=c+1; i++)
a[0][i]=a[r+1][i]=-2;
for(i=1; i<=r; i++)
{
for(j=1; j<=c; j++)
{
scanf("%c",&aux);
switch(aux)
{
case 'D': {co[++sf].x=j; co[sf].y=i; a[i][j]=-1;} break;
case '.': break;
case '*': a[i][j]=-2; break;
case 'I': {k1.x=j; k1.y=i;} break;
case 'O': {k2.x=j; k2.y=i;} break;
}
}
scanf("\n");
}
}
void bf()
{
int i;
while(inc<=sf)
{
now=co[inc++];
for(i=0; i<4; i++)
{
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if(a[next.y][next.x]==0)
{
co[++sf]=next;
if(a[now.y][now.x]!=-1)
a[next.y][next.x]=a[now.y][now.x]+1;
else
a[next.y][next.x]=1;
}
}
}
}
void dfs(int x,int y)
{
int i,x1,y1,min;
for(i=0; i<4; i++)
{
x1=x+dx[i];
y1=y+dy[i];
if(a[y1][x1]!=-2)
{
min=a[y1][x1];
if(b[y][x]<min)
min=b[y][x];
if(min>b[y1][x1])
{
b[y1][x1]=min;
if((y1==k2.y)&&(x1==k2.x))
ok=1;
dfs(x1,y1);
}
}
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n",&r,&c);
citeste();
bf();
b[k1.y][k1.x]=a[k1.y][k1.x];
dfs(k1.x,k1.y);
if(ok)
printf("%d\n",b[k2.y][k2.x]);
else
printf("-1\n");
/*for(int i=0; i<=r+1; i++)
{
for(int j=0; j<=c+1; j++)
printf("%3d ",a[i][j]);
printf("\n");
}
printf("%d %d",k1.x,k1.y);*/
return 0;
}