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