三维BFS

链接:https://ac.nowcoder.com/acm/contest/3947/J
来源:牛客网

Nancy喜欢吃果冻!
Nancy钻进了一个n×n×n的果冻里,她想从(1,1,1)一路上、下、左、右、前、后六个方向吃到(n,n,n)。
但果冻毕竟是有许多口味的,标记为*的口味是Nancy不愿意吃的,其余的果冻均标记为.。
Nancy不想吃坏肚子,于是她想尽可能少的吃果冻。
下面给出果冻的情况,请你帮忙计算一下她能吃多少块果冻叭!

输入描述:

第一行:一个整数n。
接下来n层,每组n行,每行n列,表示果冻(i,j,k)的情况(如题目描述所述)。
数据满足:1n100,保证果冻(1,1,1)不是Nancy不愿意吃的。

输出描述:

如果可以到达(n,n,n),请输出路上吃的果冻数量,否则请输出-1。
示例1

输入

复制
2
.*
..
*.
..

输出

复制
4



就是和二维的一样
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=1e2+100;
char a[maxn][maxn][maxn];
int dis[maxn][maxn][maxn];
struct node{
    int x,y,z;
};
int dx[]={0,0,1,0,0,-1};
int dy[]={0,1,0,0,-1,0};
int dz[]={1,0,0,-1,0,0};
queue<node>q;
int n; 
void bfs(){
    q.push({1,1,1});
    dis[1][1][1]=1;
    while(!q.empty()){
        node now=q.front();
        q.pop();
        for(int i=0;i<6;i++){
            int xx=now.x+dx[i],yy=now.y+dy[i],zz=now.z+dz[i];
            if(xx>=1&&yy>=1&&zz>=1&&xx<=n&&yy<=n&&zz<=n &&dis[xx][yy][zz]==-1&&a[xx][yy][zz]!='*'){
                q.push({xx,yy,zz});
                dis[xx][yy][zz]=dis[now.x][now.y][now.z]+1;
            }
        }
    }
}
int main(){
    memset(dis,-1,sizeof(dis));
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            for(int k=1;k<=n;k++){
                cin>>a[i][j][k];
            }
        }
    }
    bfs();
    cout<<dis[n][n][n]<<endl; 
}

 



posted @ 2021-01-11 23:35  哎呦哎(iui)  阅读(77)  评论(0编辑  收藏  举报