深度优先搜索是个经典算法,具体内容就不赘述了网上有很多,这个博客讲的就挺好传送门。
通过具体题目来实现深度优先搜索,这道题是美团点评2019春招笔试题,是一道典型的深度优先搜索题。
题目描述:
小团在一次星际旅行中,耗尽了飞船的能量,迷失在了空间魔方中,空间魔方中有N*N*N个能量粒子,美团云AI迅速帮小团分析出了空间魔方的能量分布图。
已知小团的飞船被困在能量值的最高的点,能量值最高点有且只有一个,飞船每到达一个能量粒子就会吸收对应粒子的能量,该粒子就会吸收对应粒子的能量,该粒子会坍塌成小黑洞,飞船不可到达。小团驾驶的飞船只能从高能量粒子驶向低能粒子,且每次只能从6个方向中选择一个前进(±x,±y,±z)。
请帮助小团算出小团吸收最高的能量值。
输入:
N(0≤N≤8)
N*N*N行空间能量数据,格式为:X Y Z P,XYZ表示点坐标,P表示空间能量分布(0≤P)
输出:
可吸收到的最高的能量值
样例输入:
2
0 0 0 7
0 0 1 2
0 1 0 4
0 1 1 3
1 0 0 6
1 0 1 1
1 1 0 5
1 1 1 0
样例输出:
28
python解题代码:
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 24 09:41:08 2019
@author: zjn
"""
import numpy as np
def dfs(x, y, z, total_ennergy):
global book
global m
global max_energy
global N
next_step = np.array([[0, 0, 1], [0, 0, -1],
[0, 1, 0], [0, -1, 0],
[1, 0, 0], [-1, 0, 0]])
if total_ennergy > max_energy:
max_energy = total_ennergy
for j in range(6):
tx = x + next_step[j, 0]
ty = y + next_step[j, 1]
tz = z + next_step[j, 2]
if tx > N-1 or tx < 0 or ty > N-1 or ty < 0 or tz > N-1 or tz < 0:
continue
if m[x, y, z] > m[tx, ty, tz] and book[tx, ty, tz] == 0:
book[tx, ty, tz] = 1
dfs(tx, ty, tz, total_ennergy + m[tx, ty, tz])
book[tx, ty, tz] = 0
N = int(input())
m = np.zeros((N, N, N))
book = np.zeros((N, N, N))
max_energy = 0
for i in range(N**3):
l = list(map(lambda x:int(x),list(input().split(' '))))
m[l[0], l[1], l[2]] = l[3]
max_index = np.where(m==np.max(m))
max_x = max_index[0][0]
max_y = max_index[1][0]
max_z = max_index[2][0]
book[max_x, max_y, max_z] = 1
dfs(max_x, max_y, max_z, np.max(m))
print(max_energy)