Jelly

Jelly

https://ac.nowcoder.com/acm/problem/201613

链接:https://ac.nowcoder.com/acm/problem/201613

题目描述:

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

输入描述:

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

输出描述:

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

solution:

感觉还是模板题,只不过二维变成了三维。
找的六个方向用数组表示为int dx[]={0,0,0,0,1,-1},dy[]={1,-1,0,0,0,0},dz[]={0,0,1,-1,0,0};
,然后就按宽搜进行遍历了,下一个位置超出范围、或遍历过、或为*就进行下一次循环

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
typedef pair<int,int> P;
int n;
char tu[105][105][105];
int dx[]={0,0,0,0,1,-1},dy[]={1,-1,0,0,0,0},dz[]={0,0,1,-1,0,0};
int d[105][105][105];
void bfs()
{
    queue<P> q;
    queue<int> q1;
    q.push(P(0,0));
    q1.push(0);
    memset(d,INF,sizeof(d));
    d[0][0][0]=1;
    while(!q.empty())
    {
        P p=q.front();q.pop();
        int pp=q1.front();q1.pop();
        for(int i=0;i<6;i++)
        {
            int x=p.first+dx[i],y=p.second+dy[i],z=pp+dz[i];
            if(x<0||x>=n||y<0||y>=n||z<0||z>=n)continue;
            if(tu[x][y][z]=='*'||d[x][y][z]!=INF)continue;
            q.push(P(x,y));
            q1.push(z);
            d[x][y][z]=d[p.first][p.second][pp]+1;
        }
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            cin>>tu[i][j];
    }
    bfs();
    if(d[n-1][n-1][n-1]==INF)
        cout<<-1;
    else
        cout<<d[n-1][n-1][n-1];
}
全部评论

相关推荐

无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务