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。
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;
}