poj 2251(三维bfs)

题目大意就是一个分层的迷宫,找出口,最短路径是多少。。。

开一个三维数组,bfs很简单就过了,就是写起来有一点点长,也没什么特别的地方。
//#include<bits/stdc++.h>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
typedef long long ll;
typedef double dl;
const int N = 1e3 + 7;
const int maxn = 31;
const int INF = 0x3f3f3f3f;
char a[maxn][maxn][maxn]; // 用于存储迷宫
int b[maxn][maxn][maxn]; // 用于存储步数
int n,m,l;
int dx[6]={0,-1,0,1,0,0};
int dy[6]={1,0,-1,0,0,0};
int dz[6]={0,0,0,0,1,-1}; // 用于控制移动方向
struct node{
    int x,y,z;
}; // 用于存储当前位置
node t,o;
bool ch(int i)
{
    if(t.x + dx[i] >= 0 && t.x + dx[i] < n && t.y + dy[i] >= 0 && t.y + dy[i] < m && t.z + dz[i] >= 0 && t.z + dz[i] < l)
        return true;
    return false;
} // 判断当前位置是否走过
int main()
{
    while(scanf("%d%d%d",&n,&m,&l) != EOF){
        memset(b,0,sizeof b);
        if(!n && !m && !l) break;
        for(int i = 0;i < n;++i)
            for(int j = 0;j < m;++j)
                scanf("%s",a[i][j]);
        node s,e; // s存储初始位置,e存储最后停止位置的状态,如果最后e的位置不是E的位置则不能逃脱
        for(int i = 0;i < n;++i)
            for(int j = 0;j < m;++j)
                for(int k = 0;k < l;++k)
                    if(a[i][j][k] == 'S'){
                        s.x = i;s.y = j;s.z = k;
                    }
        e.x = -1;e.y = -1;e.z = -1;
        b[s.x][s.y][s.z] = 1;
        queue<node> q;
        q.push(s);
        bool flag = false; // 如果能逃脱则提前终止搜索
        while(!q.empty()){
            t = q.front();
            q.pop();
            for(int i = 0;i < 6;++i){ // 移动一步所能达到的位置
                if(ch(i) && a[t.x + dx[i]][t.y + dy[i]][t.z + dz[i]] == '.' && !b[t.x + dx[i]][t.y + dy[i]][t.z + dz[i]]){
                    b[t.x + dx[i]][t.y + dy[i]][t.z + dz[i]] = b[t.x][t.y][t.z] + 1;
                    o.x = t.x + dx[i];o.y = t.y + dy[i];o.z = t.z + dz[i];
                    q.push(o);
                    //printf("***%d %d %d***\n",o.x,o.y,o.z);
                }
                if(ch(i) && a[t.x + dx[i]][t.y + dy[i]][t.z + dz[i]] == 'E'){ // 判断搜索的终止状态
                    e.x = t.x + dx[i];e.y = t.y + dy[i];e.z = t.z + dz[i];
                    b[t.x + dx[i]][t.y + dy[i]][t.z + dz[i]] = b[t.x][t.y][t.z] + 1;
                    flag = true;
                    break;
                }
            }
            if(flag) break;
        }
        //printf("%d %d %d**\n",e.x,e.y,e.z);
        if(e.x != -1) printf("Escaped in %d minute(s).\n",b[e.x][e.y][e.z] - 1);
        else printf("Trapped!\n");
    }
    return 0;
}
感觉这题很水,就是写起来特别长

猜你喜欢

转载自blog.csdn.net/qq_41791981/article/details/80501192
今日推荐