ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

POJ-2251 Dungeon Master (三维BFS)

2020-08-12 23:32:38  阅读:239  来源: 互联网

标签:tmp Dungeon bfs int BFS Master && ez 100


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

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

标签:tmp,Dungeon,bfs,int,BFS,Master,&&,ez,100
来源: https://www.cnblogs.com/lr599909928/p/13493749.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有