Pagini recente » Cod sursa (job #960308) | Cod sursa (job #741255) | Cod sursa (job #889965) | Cod sursa (job #2160627) | Cod sursa (job #369934)
Cod sursa(job #369934)
#include<stdio.h>
#define mod 3999988
int i,j,n,m,a[1100][1100],b[1100][1100],k,ii,ij,fi,fj,max;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
struct nod
{
int x,y;
}p[4000000];
char s[1100][1100];
void compara(int i,int j)
{
for(int t=0;t<4;t++) { int i1=i+dx[t];
int j1=j+dy[t];
if(i1<=n&&i1>0&&j1<=m&&j1>0)
{ if((b[i1][j1]==0||b[i1][j1]>b[i][j]+1)&&(s[i1][j1]!='D'))
{ b[i1][j1]=b[i][j]+1;
p[(++k)%mod].x=i1;
p[k%mod].y=j1;
}
}
}
}
void compara1(int i,int j)
{
for(int t=0;t<4;t++) { int i1=i+dx[t];
int j1=j+dy[t];
if(i1<=n&&i1>0&&j1<=m&&j1>0)
if(a[i1][j1]>=0)
if(a[i][j]>a[i1][j1]) if(a[i][j]<b[i1][j1])
{ a[i1][j1]=a[i][j];
p[(++k)%mod].x=i1;
p[k%mod].y=j1;
}
else { a[i1][j1]=b[i1][j1];
p[(++k)%mod].x=i1;
p[k%mod].y=j1;
}
}
}
int main()
{
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{ scanf("%s",s[i]+1);
for(j=1;j<=m;j++) { if(s[i][j]=='*') a[i][j]=-1,b[i][j]=-1;
else if(s[i][j]=='D') { a[i][j]=-1;
p[++k].x=i;
p[k].y=j;
}
else if(s[i][j]=='I') { ii=i;
ij=j;
}
else if(s[i][j]=='O') { fi=i;
fj=j;
}
}
}
for(i=1;i<=k;i++) compara(p[i].x,p[i].y);
k=0;
a[ii][ij]=b[ii][ij];
p[++k].x=ii;
p[k].y=ij;
for(i=1;i<=k;i++) compara1(p[i].x,p[i].y);
if(!a[fi][fj]) printf("-1\n");
else printf("%d\n",a[fi][fj]);
fclose(stdin);
fclose(stdout);
return 0;
}