BFS求最短距离模板
链接:https://ac.nowcoder.com/acm/contest/5338/A
来源:牛客网
来源:牛客网
Nancy喜欢吃果冻!
Nancy钻进了一个n×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列,表示果冻(i,j,k)的情况(如题目描述所述)。
数据满足:1≤n≤1001 \leq n \leq 1001≤n≤100,保证果冻(1,1,1)不是Nancy不愿意吃的。
由题目可知这道题是三维BFS
#include<bits/stdc++.h> using namespace std; int n; int ans=0; int dz[6]={1,-1,0,0,0,0}; int dx[6]={0,0,0,0,1,-1}; int dy[6]={0,0,-1,1,0,0}; char Map[120][120][120];//x,y,z bool vis[120][120][120]; class Node { public: int z; int x; int y; int val; Node(int a,int b,int c,int d) { z=a; x=b; y=c; val=d; } }; int Bfs(int z,int x,int y) { queue<Node> p; int f1=0; vis[z][x][y]=1; Node a(z,x,y,1); p.push(a); while(!p.empty()) { if(f1) break; Node temp=p.front(); p.pop(); for(int i=0;i<6;i++) { int iz=temp.z+dz[i]; int ix=temp.x+dx[i]; int iy=temp.y+dy[i]; int ival=temp.val+1; if(iz>=1&&iz<=n&&ix>=0&&ix<=n&&iy>=0&&iy<=n&&!vis[iz][ix][iy]&&Map[iz][ix][iy]=='.') { if(iz==n&&ix==n&&iy==n) f1=ival; Node h(iz,ix,iy,ival); p.push(h); vis[iz][ix][iy]=1; } } } return f1; } int main() { memset(vis,0,sizeof(vis)); scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int k=1;k<=n;k++) { cin>>Map[i][j][k]; } } } ans=Bfs(1,1,1); if(vis[n][n][n]) cout<<ans<<endl; else cout<<"-1"<<endl; }

浙公网安备 33010602011771号