Jelly
Jelly
https://ac.nowcoder.com/acm/problem/201613
链接:https://ac.nowcoder.com/acm/problem/201613
题目描述:
Nancy喜欢吃果冻!
Nancy钻进了一个n×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。
solution:
感觉还是模板题,只不过二维变成了三维。
找的六个方向用数组表示为int dx[]={0,0,0,0,1,-1},dy[]={1,-1,0,0,0,0},dz[]={0,0,1,-1,0,0};
,然后就按宽搜进行遍历了,下一个位置超出范围、或遍历过、或为*就进行下一次循环
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f typedef pair<int,int> P; int n; char tu[105][105][105]; int dx[]={0,0,0,0,1,-1},dy[]={1,-1,0,0,0,0},dz[]={0,0,1,-1,0,0}; int d[105][105][105]; void bfs() { queue<P> q; queue<int> q1; q.push(P(0,0)); q1.push(0); memset(d,INF,sizeof(d)); d[0][0][0]=1; while(!q.empty()) { P p=q.front();q.pop(); int pp=q1.front();q1.pop(); for(int i=0;i<6;i++) { int x=p.first+dx[i],y=p.second+dy[i],z=pp+dz[i]; if(x<0||x>=n||y<0||y>=n||z<0||z>=n)continue; if(tu[x][y][z]=='*'||d[x][y][z]!=INF)continue; q.push(P(x,y)); q1.push(z); d[x][y][z]=d[p.first][p.second][pp]+1; } } } int main() { cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cin>>tu[i][j]; } bfs(); if(d[n-1][n-1][n-1]==INF) cout<<-1; else cout<<d[n-1][n-1][n-1]; }