Virtual Judge POJ 2251 Dungeon Master

倾然丶 夕夏残阳落幕 提交于 2019-12-02 13:14:26

三维数组加宽搜

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
const int  MAXN=50;
int c, k, h;
char ma[MAXN][MAXN][MAXN];  //定义三维数组  长宽高
int visit[MAXN][MAXN][MAXN];  //标记数组
struct node {
    int c, k, h;//结构体记录到达某个点  c长k宽h高
    int step;//走的步数
};
struct node t[33433];//结构体队列
struct node p, q, w, l;
int f[][3] = {0,0,1, 0,0,-1, 0,1,0, 0,-1,0, 1,0,0, -1,0,0};//向上下左右前后六个方向移动  包括上楼
void bfs() {
    visit[p.c][p.k][p.h] = 1;//标记已经走过
    int front = 0, rear = 0;
    t[rear++] = p;//入队
    while(front!=rear) { //当队列不为空的时候
        w = t[front++];
        if(w.c==q.c&&w.k==q.k&&w.h==q.h) { //如果是终点,直接输出
            printf("Escaped in %d minute(s).\n", w.step);
            return ;
        }
        for(int i=0; i<6; i++) { //否则,遍历六个方向
            l = w;
            l.c += f[i][0];
            l.k += f[i][1];
            l.h += f[i][2];
            if(l.c>=0&&l.c<c&&l.k>=0&&l.k<k&&l.h>=0&&l.h<h&&ma[l.c][l.k][l.h]!='#'&&visit[l.c][l.k][l.h]==0) { //如果符合条件
                l.step++;//步数增加
                visit[l.c][l.k][l.h] = 1;//标记访问过了
                t[rear++] = l;//入列
            }
        }
    }
    printf("Trapped!\n");//否则,输出无法到达
}
int main() {
    memset(t, 0, sizeof(struct node));  //先清空
    while(~scanf("%d %d %d", &c, &k, &h)) { //c长k宽h高
        if(c==0&&k==0&&h==0) break;
        for(int i=0; i<c; i++) {
            for(int j=0; j<k; j++) {
                scanf("%s", ma[i][j]);//按照字符串输入
                for(int w = 0; w<h; w++) {
                    if(ma[i][j][w]=='S') { //记录起点
                        p.c = i;
                        p.k = j;
                        p.h = w;
                        p.step = 0;
                    } else if(ma[i][j][w]=='E') { //记录终点
                        q.c = i;
                        q.k = j;
                        q.h = w;
                    }
                }
            }
        }
        memset(visit, 0, sizeof(visit));//清空标记数组
        bfs();//广搜
    }
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!