来源:牛客网
Nancy喜欢吃果冻!
Nancy钻进了一个n×n×nn \times n \times nn×n×n的果冻里,她想从(1,1,1)一路上、下、左、右、前、后六个方向吃到(n,n,n)。
但果冻毕竟是有许多口味的,标记为*的口味是Nancy不愿意吃的,其余的果冻均标记为.。
Nancy不想吃坏肚子,于是她想尽可能少的吃果冻。
下面给出果冻的情况,请你帮忙计算一下她能吃多少块果冻叭!
输入描述:
第一行:一个整数n。 接下来n层,每组n行,每行n列,表示果冻(i,j,k)的情况(如题目描述所述)。 数据满足:1≤n≤1001 \leq n \leq 1001≤n≤100,保证果冻(1,1,1)不是Nancy不愿意吃的。
输出描述:
如果可以到达(n,n,n),请输出路上吃的果冻数量,否则请输出-1。
示例1
输入
复制2 .* .. *. ..
2 .* .. *. ..
输出
复制4
4
Jelly (简单BFS&三维)
思路:板子题。具体看代码。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+5;
int n,d[6][3]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
char mp[N][N][N];
int a[N][N][N];
struct p{
int x,y,z;
}s,e;
#define jg(x,y,z) (x>=0&&x<n&&y>=0&&y<n&&z>=0&&z<=n)
int bfs(){
queue<p>q;
q.push({0,0,0});
while(q.size()){
s=q.front();q.pop();
if(s.x==n-1&&s.y==n-1&&s.z==n-1) return a[s.x][s.y][s.z];
for(int i=0;i<6;i++)
{
int nx=s.x+d[i][0],ny=s.y+d[i][1],nz=s.z+d[i][2];
if(jg(nx,ny,nz)&&mp[nx][ny][nz]=='.'){
mp[nx][ny][nz]='*';
a[nx][ny][nz]=a[s.x][s.y][s.z]+1;
q.push({nx,ny,nz});
}
}
}
return -2;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%s",mp[i][j]);
printf("%d\n", bfs()+1);
return 0;
}