牛客小白月赛21 J.Jelly

牛客小白月赛21 J.Jelly

题目描述

Nancy喜欢吃果冻!
Nancy钻进了一个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。

示例1

输入

2
.*
..
*.
..

输出

4

一遍过的,比较水的三维bfs,话不多说,上代码:

#include<bits/stdc++.h>
using namespace std;

int n,m;
int mo[6][3]={-1,0,0, 0,-1,0, 0,0,-1, 1,0,0, 0,1,0, 0,0,1};
char ma[105][105][105];
int q[40000][3];
int step[105][105][105];

void bfs(int x,int y,int z)
{
    memset(step,0,sizeof(step));
    step[x][y][z]=0;
    int head=0;
    q[head][0]=x;
      q[head][1]=y;
        q[head][2]=z;
          int tail=1;
  while(head<tail)
    {
        int x1=q[head][0];
        int y1=q[head][1];
        int z1=q[head][2];
        if(x1==n && y1==n && z1==n)
        {
            cout<<step[x1][y1][z1]+1;
            return;
        }
        for(int i=0;i<6;i++)
        {
           int x2=x1+mo[i][0];
           int y2=y1+mo[i][1];
           int z2=z1+mo[i][2];
           if(step[x2][y2][z2]==0 && x2>=1 && x2<=n && y2>=1 && y2<=n && z2>=1 && z2<=n && ma[x2][y2][z2]=='.')
            {
                step[x2][y2][z2]=step[x1][y1][z1]+1;
	            q[tail][0]=x2;
	            q[tail][1]=y2;
	            q[tail][2]=z2;
	            tail++;
            }
        }
     head++;
   }
   cout<<-1;
 }

int main()
{
        cin>>n;
        memset(q,0,sizeof(q));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                for(int k=1;k<=n;k++)
                   cin>>ma[i][j][k];
            }
        }
     bfs(1,1,1);
    return 0;
}
发布了235 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43765333/article/details/104037231