Pagini recente » Cod sursa (job #642864) | Cod sursa (job #2579657) | Cod sursa (job #2519875) | Cod sursa (job #715684) | Cod sursa (job #197215)
Cod sursa(job #197215)
#include<stdio.h>
#include<math.h>
char c;
int xi,yi,xo,yo,x,y,n,m,j,l,a[1001][1001],stx[50000],sty[5000],cx[50000],cy[50000];
long i,k,o;
FILE *f,*g;
int main()
{ f=fopen("barbar.in","r"); g=fopen("barbar.out","w");
fscanf(f,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{ fscanf(f,"%c",&c);
for(j=1;j<=m;j++)
{ fscanf(f,"%c",&c);
if(c=='.') a[i][j]=-3;
else if(c=='*') a[i][j]=-1;
else if(c=='D') { k++; stx[k]=i; sty[k]=j; }
else if(c=='I') { xi=i; yi=j; }
else if(c=='O') { xo=i; yo=j; }
}
}
for(i=1;i<=k;i++)
for(j=1;j<=n;j++)
for(l=1;l<=m;l++)
if(a[j][l]==-3) a[j][l]=abs(j-stx[i])+abs(l-sty[i]);
else if(abs(j-stx[i])+abs(l-sty[i])<a[i][j]&&a[j][l]!=-1) a[j][l]=abs(j-stx[i])+abs(l-sty[i]);
k=1;
stx[k]=xi; sty[j]=yi;
while(k)
{ o=0;
for(i=1;i<=k;i++)
{ x=stx[i]; y=sty[i];
if(a[x][y-1]!=-1&&a[x][y-1]>a[x][y]) { a[x][y-1]=a[x][y]; o++; cx[o]=x; cy[o]=y-1; }
if(a[x][y+1]!=-1&&a[x][y+1]>a[x][y]) { a[x][y+1]=a[x][y]; o++; cx[o]=x; cy[o]=y+1; }
if(a[x-1][y]!=-1&&a[x-1][y]>a[x][y]) { a[x-1][y]=a[x][y]; o++; cx[o]=x-1; cy[o]=y; }
if(a[x+1][y]!=-1&&a[x+1][y]>a[x][y]) { a[x+1][y]=a[x][y]; o++; cx[o]=x+1; cy[o]=y; }
}
for(i=1;i<=o;i++) { stx[i]=cx[i];sty[i]=cy[i]; }
k=o;
}
fprintf(g,"%d",a[xo][yo]);
fclose(g);
return 0;
}