Jelly

*Nancy喜欢吃果冻!
Nancy钻进了一个n \times n \times nn×n×n的果冻里,她想从(1,1,1)一路上、下、左、右、前、后六个方向吃到(n,n,n)。
但果冻毕竟是有许多口味的,标记为的口味是Nancy不愿意吃的,其余的果冻均标记为.。
Nancy不想吃坏肚子,于是她想尽可能少的吃果冻。
下面给出果冻的情况,请你帮忙计算一下她能吃多少块果冻叭!
输入描述:
第一行:一个整数n。
接下来n层,每组n行,每行n列,表示果冻(i,j,k)的情况(如题目描述所述)。
数据满足:1 \leq n \leq 1001≤n≤100,保证果冻(1,1,1)不是Nancy不愿意吃的。
输出描述:
如果可以到达(n,n,n),请输出路上吃的果冻数量,否则请输出-1。
示例1
输入
2
.


.

输出
4

三维真香

代码(BFS)

#include<bits/stdc++.h>
using namespace std;
int n,m,dir[6][3]={-1,0,0, 0,-1,0, 0,0,-1, 1,0,0, 0,1,0, 0,0,1},flag;
char s[105][105][105];
bool vis[105][105][105];
struct num{
    int x,y,z,step;
};
queue<num>q;
void bfs(){
    num tt;
    tt.x=1;
    tt.y=1;
    tt.z=1;
    tt.step=1;
    vis[1][1][1]=1;
    q.push(tt);
    while(!q.empty()){
        num t=q.front();
        q.pop();
        if(t.x==n&&t.y==n&&t.z==n){
            cout<<t.step<<endl;
            flag=1;
            return;
        }
        for(int i=0;i<6;i++){
            int fx=t.x+dir[i][0];
            int fy=t.y+dir[i][1];
            int fz=t.z+dir[i][2];
            if(fx>=1&&fx<=n&&fy>=1&&fy<=n&&fz>=1&&fz<=n&&!vis[fx][fy][fz]&&s[fx][fy][fz]=='.'){
                vis[fx][fy][fz]=1;
                num ft;
                ft.x=fx;
                ft.y=fy;
                ft.z=fz;
                ft.step=t.step+1;
                q.push(ft);
            }
        }
    }
    return;
}
int main(){
    while(cin>>n){
        flag=0;
        memset(vis,0, sizeof(vis));
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                for(int z=1;z<=n;z++){
                    cin>>s[i][j][z];
                }
            }
        }
        bfs();
        if(!flag) cout<<"-1"<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值