Pagini recente » Cod sursa (job #278182) | Cod sursa (job #455444) | Cod sursa (job #1989167) | Cod sursa (job #595309) | Cod sursa (job #116303)
Cod sursa(job #116303)
#include <fstream.h>
#include <stdio.h>
#define NMAX 1001
#define INF 1001
struct point { int x,y;} v[NMAX*NMAX],k;
char a[NMAX][NMAX];
int dist[NMAX][NMAX];
int mat[NMAX][NMAX];
int vx[]={-1,0,1,0};
int vy[]={0,-1,0,1};
int lee[NMAX][NMAX];
int r,c;
void calc(int x,int y)
{ int pr=1,ult=1,i,j;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
{ lee[i][j]=-1;
if (a[i][j]=='*') lee[i][j]=-2;
}
lee[x][y]=0;
v[1].x=x;
v[1].y=y;
while (pr<=ult)
{ k=v[pr++];
for (i=0;i<=3;i++)
if (lee[k.x+vx[i]][k.y+vy[i]]==-1)
{ v[++ult].x=k.x+vx[i];
v[ult].y=k.y+vy[i];
lee[v[ult].x][v[ult].y]=lee[k.x][k.y]+1;
}
}
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
if (lee[i][j]<dist[i][j]&&lee[i][j]>=0)
dist[i][j]=lee[i][j];
}
int main()
{ int i,j,ii,ij,fi,fj;
long pr,ult;
char ch;
fstream f("barbar.in",ios::in);
ofstream g("barbar.out");
f>>r>>c;
f.get();
for (i=1;i<=r;i++)
{ a[i][0]=' ';
for (j=1;j<=c;j++)f>>a[i][j];
f.get();
}
f.close();
for (i=0;i<=r+1;i++)
{ a[i][0]='*';
a[i][c+1]='*';
}
for (j=0;j<=c+1;j++)
{ a[0][j]='*';
a[r+1][j]='*';
}
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
{if (a[i][j]=='I') { ii=i;ij=j;}
if (a[i][j]=='0') { fi=i;fj=j;}
}
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
dist[i][j]=INF;
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
if (a[i][j]=='D')
calc(i,j);
for (i=1;i<=r;i++)
for (j=1;j<=c;j++)
mat[i][j]=-1;
pr=ult=1;
v[1].x=ii;
v[1].y=ij;
mat[ii][ij]=dist[ii][ij];
while(pr<=ult)
{ k=v[pr++];
for (i=0;i<=3;i++)
if (a[k.x+vx[i]][k.y+vy[i]]!='*'&&mat[k.x+vx[i]][k.y+vy[i]]<mat[k.x][k.y])
{ v[++ult].x=k.x+vx[i];
v[ult].y=k.y+vy[i];
mat[v[ult].x][v[ult].y]=mat[k.x][k.y];
if (dist[v[ult].x][v[ult].y]<mat[v[ult].x][v[ult].y])
mat[v[ult].x][v[ult].y]=dist[v[ult].x][v[ult].y];
}
}
g<<mat[fi][fj];
g.close();
return 0;
}