POJ-2251 Dungeon Master (三维BFS)

POJ-2251 Dungeon Master (三维BFS)

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

  • 题解:应该是个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;
    }
    
上一篇:ZeroMQ作者:为什么我希望用C而不是C++来实现ZeroMQ


下一篇:UVA532 Dungeon Master(三维BFS)