先看题目:https://ac.nowcoder.com/acm/problem/201613
题目描述:
三维果冻中,从(1,1,1)开始吃,能避开障碍吃到(n,n,n)的最小果冻数。
解题思路:
管它是几维,改改方向数组,然后直接bfs最短路径呗~
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int dis[110][110][110];
bool mp[110][110][110];
int dir[6][3]={{0,0,1},{0,0,-1},{0,1,0},{0,-1,0},{1,0,0},{-1,0,0}};
struct node{
int x,y,z;
};
queue<node> q;
int bfs()
{
q.push({1,1,1});
dis[1][1][1]=1;
while(!q.empty()) {
node tmp = q.front();
q.pop();
for(int i = 0; i < 6; i++){
int dx = tmp.x+dir[i][0];
int dy = tmp.y+dir[i][1];
int dz = tmp.z+dir[i][2];
if(dx < 1 || dx > n || dy < 1 || dy > n || dz < 1 || dz > n) continue;
if(mp[dx][dy][dz] == 0) continue;
if(dis[dx][dy][dz] != 0) continue;
dis[dx][dy][dz]=dis[tmp.x][tmp.y][tmp.z]+1;
if(dx == n && dy == n && dz == n) return 1;
q.push({dx,dy,dz});
}
}
return 0;
}
int main()
{
scanf("%d",&n);
for(int i = 1 ; i <= n; i++)
for(int j = 1; j <= n; j++)
for(int k = 1; k <= n; k++) {
char c;
scanf(" %c",&c);
if(c == '.') {mp[i][j][k] = 1;}
else if(c == '*') {mp[i][j][k] = 0;}
}
if(bfs()) printf("%d\n",dis[n][n][n]);
else printf("-1\n");
}
京公网安备 11010502036488号