Pagini recente » Cod sursa (job #2054479) | Cod sursa (job #123735) | Profil M@2Te4i | Cod sursa (job #1820138) | Cod sursa (job #369940)
Cod sursa(job #369940)
#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];
int doo(int x)
{
while(x>mod) x-=mod;
return x;
}
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[doo(++k)].x=i1;
p[doo(k)].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[doo(++k)].x=i1;
p[doo(k)].y=j1;
}
else { a[i1][j1]=b[i1][j1];
p[doo(++k)].x=i1;
p[doo(k)].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++) { int q=doo(i);
compara(p[q].x,p[q].y);
}
k=0;
a[ii][ij]=b[ii][ij];
p[++k].x=ii;
p[k].y=ij;
for(i=1;i<=k;i++) { int q=doo(i);
compara1(p[q].x,p[q].y);
}
if(!a[fi][fj]) printf("-1\n");
else printf("%d\n",a[fi][fj]);
fclose(stdin);
fclose(stdout);
return 0;
}