首页 > 其他 > 详细

POJ-2251 Dungeon Master (三维BFS)

时间:2020-08-13 00:15:42      阅读:73      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:有一个三维的图,问能否从起点走到终点,若能,输出最小步数.

  • 题解:应该是个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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!