题意:有一个三维的图,问能否从起点走到终点,若能,输出最小步数.
题解:应该是个bfs模板题,但是第一次写到三维图的题目,注意开三维数组存图,然后遍历方向的时候记得向z轴上下跑两个就行了.
代码:
struct misaka{
int x,y,z;
}e;
int l,r,c;
char s[100][100][100];
int dis[100][100][100];
int sx,sy,sz,ex,ey,ez;
int dx[6]={0,1,0,-1,0,0},dy[6]={1,0,-1,0,0,0},dz[6]={0,0,0,0,1,-1};
int bfs(){
queue<misaka> q;
q.push({sx,sy,sz});
while(!q.empty()){
misaka tmp=q.front();
q.pop();
int x=tmp.x;
int y=tmp.y;
int z=tmp.z;
if(x==ex && y==ey && z==ez) break;
for(int i=0;i<6;++i){
int tx=x+dx[i];
int ty=y+dy[i];
int tz=z+dz[i];
if(tx>=0 && tx<l && ty>=0 && ty<r && tz>=0 && tz<c && (s[tx][ty][tz]==‘.‘ || s[tx][ty][tz]==‘E‘) && dis[tx][ty][tz]==INF){
dis[tx][ty][tz]=dis[x][y][z]+1;
q.push({tx,ty,tz});
}
}
}
return dis[ex][ey][ez];
}
int main() {
//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
while(scanf("%d %d %d",&l,&r,&c)){
if(l==0 && r==0 && c==0) break;
for(int i=0;i<l;++i){
for(int j=0;j<r;++j){
scanf("%s",s[i][j]);
for(int k=0;k<c;++k){
dis[i][j][k]=INF;
if(s[i][j][k]==‘S‘){
dis[i][j][k]=0;
sx=i;
sy=j;
sz=k;
}
else if(s[i][j][k]==‘E‘){
ex=i;
ey=j;
ez=k;
}
}
}
}
int res=bfs();
if(res==INF) puts("Trapped!");
else printf("Escaped in %d minute(s).\n",res);
}
return 0;
}
POJ-2251 Dungeon Master (三维BFS)
原文:https://www.cnblogs.com/lr599909928/p/13493749.html