Pagini recente » Cod sursa (job #2864091) | Cod sursa (job #1448192) | Cod sursa (job #2349048) | Cod sursa (job #1534390) | Cod sursa (job #415607)
Cod sursa(job #415607)
#include<stdio.h>
struct cd{
int i,j,cost;
};
int di[]={0,0,1,-1,0};
int dj[]={0,1,0,0,-1};
cd q[1000001],a;
int m[1001][1001],f[1001][1001];
int r,c,i,j,x1,x2,y1,y2,iv,jv,p,poz;
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
int ok=0,k=1,in=1,sf=2;
char ch;
cd q[10001],a;
scanf("%d%d\n",&r,&c);
for(i=1;i<=r;i++){
for(j=1;j<=c;j++){
scanf("%c",&ch);
if(ch=='.'){
m[i][j]=99999;
}
if(ch=='D'){
m[i][j]=0;
q[k].i=i;
q[k].j=j;
q[k].cost=0;
k++;
}
if(ch=='I'){
x1=i;
y1=j;
m[i][j]=99999;
}
if(ch=='O'){
x2=i;
y2=j;
m[i][j]=99999;
}
if(ch=='*'){
m[i][j]=-1;
}
}
scanf("\n");
}
sf=k;
while(in<sf)
{
a=q[in];
in++;
for(i=1;i<=4;i++)
{
iv=a.i+di[i];
jv=a.j+dj[i];
if((1<=iv)&&(iv<=r)&&(1<=jv)&&(jv<=c)&&(m[iv][jv]!=-1)&&(a.cost+1<m[iv][jv]))
{
m[iv][jv]=a.cost+1;
q[sf].i=iv;
q[sf].j=jv;
q[sf].cost=a.cost+1;
sf++;
}
}
}
for(p=1;p*2<=m[x1][y1];p*=2);
ok=0;
k=0;
for(poz=0;p;p/=2)
{
for(i=1;i<=r;i++){
for(j=1;j<=c;j++){
f[i][j]=0;
}
}
in=1;
sf=2;
q[1].i=x1;
q[1].j=y1;
q[1].cost=m[x1][y1];
if(poz+p<=m[x1][y1]){
while(in<sf)
{
a=q[in];
if(a.i==x2&&a.j==y2){
ok=1;
poz+=p;
k=poz;
break;
}
in++;
for(i=1;i<=4;i++)
{
iv=a.i+di[i];
jv=a.j+dj[i];
if((1<=iv)&&(iv<=r)&&(1<=jv)&&(jv<=c)&&(m[iv][jv]!=-1)&&(poz+p<=m[iv][jv])&&f[iv][jv]==0)
{
q[sf].i=iv;
q[sf].j=jv;
q[sf].cost=m[iv][jv];
sf++;
f[iv][jv]=1;
}
}
}
}
}
if(ok==1){
printf("%d",k);
}
else{
printf("-1");
}
return 0;
}