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