这道题的题目很明确,没有坑,只需要搜索最短路径比对魔王回来的时间就可以了。只是跟平常的搜索有区别的是这道题的地图是三维的。
我们只需要将数据记录在三维数组中进行搜索就行了。
#include<iostream> #include <stdio.h> #include <cstring> #include <algorithm> #include <queue> #include <stdlib.h> using namespace std; #define N 51 char map[N][N][N] = {0}; //三维地图 int A, B, C, T; char vis[N][N][N] = {0}; //是否搜索过的标记 struct node { int x, y, z; int time; }; int dir[6][3] = { { 1, 0, 0 }, { -1, 0, 0 }, { 0, 1, 0 }, { 0, -1, 0 }, { 0, 0, 1 }, { 0, 0, -1 } }; //方向 int Judge(int x, int y, int z) //判断边界 { if (x >= 0 && x < A&& y >= 0 && y < B && z >= 0 && z < C && map[x][y][z] == 0) { return 1; } else { return 0; } } int bfs(int n) //搜索开始 { node start, end; int i; queue<node>q; start.x = 0; start.y = 0; start.z = 0; start.time = 0; q.push(start); memset(vis, 0, sizeof(vis)); vis[0][0][0] = 1; while (!q.empty()) { start = q.front(); q.pop(); if (start.time > n) //如果已经超过了最短时间返回-1 { return -1; } if (start.x == A - 1 && start.y == B - 1 && start.z == C - 1 && start.time <= n) //如果到达终点位置返回需要的时间 { return start.time; } int i; for (i = 0; i < 6; i++) { end.x = start.x + dir[i][0]; end.y = start.y + dir[i][1]; end.z = start.z + dir[i][2]; if (Judge(end.x, end.y, end.z) == 1 && vis[end.x][end.y][end.z] == 0) { vis[end.x][end.y][end.z] = 1; end.time = start.time + 1; if (abs(end.x - A + 1) + abs(end.y - B + 1) + abs(end.z - C + 1) + end.time >n)//此步用来简化搜索 continue; q.push(end); } } } return -1; } int main() { int i, j, k, t; scanf("%d", &t); while (t--) { scanf("%d%d%d%d", &A, &B, &C, &T); for (i = 0; i < A; i++) { for (j = 0; j < B; j++) { for (k = 0; k < C; k++) { scanf("%d", &map[i][j][k]); } } } int ans = 0; ans = bfs(T); printf("%d\n", ans); } return 0; }