Pagini recente » Cod sursa (job #870541) | Cod sursa (job #1270238) | Cod sursa (job #3294145) | Cod sursa (job #1707965) | Cod sursa (job #91029)
Cod sursa(job #91029)
#include <stdio.h>
#include <values.h>
FILE *f=fopen("barbar.in","r");
FILE *g=fopen("barbar.out","w");
struct rec{ int s,d;} b[2][3000005];
int dx[] = {0, 0, -1, 1},
dy[] = {-1,1, 0, 0};
int a[1003][1003],c[1003][1003],xi,yi,xf,yf,n,m,i,j;
char x;
void lee1()
{
int p,aux,nr,i,l,u,r,t,j;
p=1; i=0; l=2; u=b[i][0].s;
while (p<=u) {
b[l][0].s=0;
for (p=1; p<=u; p++)
for (j=0; j<=3; j++) {
r=dx[j]; t=dy[j];
if (a[b[i][p].s+r][b[i][p].d+t]>(a[b[i][p].s][b[i][p].d]+1)) {
++b[l][0].s; nr=b[l][0].s;
b[l][nr].s=b[i][p].s+r;
b[l][nr].d=b[i][p].d+t;
a[b[i][p].s+r][b[i][p].d+t]=a[b[i][p].s][b[i][p].d]+1;
}
}
aux=i; i=l; l=aux;
p=1; u=b[i][0].s;
}
}
void lee2()
{
int p,aux,nr,i,l,u,r,t,j;
p=1; i=0; l=2; u=1;
b[i][0].s=1; b[i][1].s=xi; b[i][1].d=yi;
c[xi][yi]=a[xi][yi];
while (p<=u) {
b[l][0].s=0;
for (p=1; p<=u; p++)
for (j=0; j<=3; j++) {
r=dx[j]; t=dy[j];
if ((b[i][p].s+r>0)&&(b[i][p].s+r<=n)&&(b[i][p].d+t>0)&&(b[i][p].d+t<=m)) {
if (c[b[i][p].s+r][b[i][p].d+t]==0) {
c[b[i][p].s+r][b[i][p].d+t]=c[b[i][p].s][b[i][p].d];
if (c[b[i][p].s+r][b[i][p].d+t]>a[b[i][p].s+r][b[i][p].d+t]) c[b[i][p].s+r][b[i][p].d+t]=a[b[i][p].s+r][b[i][p].d+t];
else;
++b[l][0].s; nr=b[l][0].s;
b[l][nr].s=b[i][p].s+r;
b[l][nr].d=b[i][p].d+t;
}
else if ((a[b[i][p].s+r][b[i][p].d+t]>=c[b[i][p].s][b[i][p].d])&&(c[b[i][p].s+r][b[i][p].d+t]<c[b[i][p].s][b[i][p].d])){
++b[l][0].s; nr=b[l][0].s;
b[l][nr].s=b[i][p].s+r;
b[l][nr].d=b[i][p].d+t;
c[b[i][p].s+r][b[i][p].d+t]=c[b[i][p].s][b[i][p].d];
}
}
}
aux=i; i=l; l=aux;
p=1; u=b[i][0].s;
}
}
int main()
{
fscanf(f,"%d %d\n", &n, &m);
for (i=0; i<=n+1; i++)
for (j=0; j<=n+1; j++) a[i][j]=-1;
for (i=1; i<=n; i++) {
for (j=1; j<=m; j++) {
fscanf(f,"%c",&x);
if (x=='D') { b[0][++b[0][0].s].s=i; b[0][b[0][0].s].d=j; a[i][j]=0;}
else if (x=='*') a[i][j]=-1;
else {
a[i][j]=INT_MAX;
if (x=='I') {xi=i; yi=j; };
if (x=='0') {xf=i; yf=j; }
}
}
fscanf(f,"\n");
}
lee1();
for (i=0; i<=n+1; i++)
for (j=0; j<=n+1; j++) c[i][j]=0;
lee2();
fprintf(g,"%ld", c[xf][yf]);
return 0;
}