华为od python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import sys
rows = 4
cols = 4
matrix  = [[0, 1,1,1], [30, 30,-1,40],[0, 20,20,40],[10, -1,30,40]]
offsets = ((-1, 0), (1, 0), (0, -1), (0, 1))
class Node:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.initial_energy = 0
        self.remaining_energy = 0
        self.has_energy_booster = False
 
 
def bfs():
    if matrix[0][0] == 0 or matrix[rows - 1][cols - 1] == 0:
        return -1
 
    queue = []
 
    src = Node(0, 0)
 
    if matrix[0][0] == -1:
        src.initial_energy = 0
        src.remaining_energy = 100
        src.has_energy_booster = True
    else:
        src.initial_energy = matrix[0][0]
        src.remaining_energy = 0
        src.has_energy_booster = False
 
    queue.append(src)
 
    distance_from_start = [[sys.maxsize] * cols for _ in range(rows)]
    remaining_energy_at_destination = [[0] * cols for _ in range(rows)]
 
    distance_from_start[0][0] = src.initial_energy
    remaining_energy_at_destination[0][0] = src.remaining_energy
 
    while len(queue) > 0:
        cur = queue.pop(0)
 
        for offsetX, offsetY in offsets:
            newX = cur.x + offsetX
            newY = cur.y + offsetY
 
            if newX < 0 or newX >= rows or newY < 0 or newY >= cols or matrix[newX][newY] == 0:
                continue
 
            initial_energy = cur.initial_energy
            remaining_energy = cur.remaining_energy
            has_energy_booster = cur.has_energy_booster
 
            if matrix[newX][newY] == -1:
                remaining_energy = 100
                has_energy_booster = True
            else:
                remaining_energy -= matrix[newX][newY]
 
            if remaining_energy < 0:
                if has_energy_booster:
                    continue
                else:
                    initial_energy -= remaining_energy
                    remaining_energy = 0
 
            if initial_energy > 100:
                continue
 
            if initial_energy > distance_from_start[newX][newY]:
                continue
 
            if initial_energy < distance_from_start[newX][newY] or remaining_energy > \
                    remaining_energy_at_destination[newX][newY]:
                distance_from_start[newX][newY] = initial_energy
                remaining_energy_at_destination[newX][newY] = remaining_energy
 
                nxt = Node(newX, newY)
                nxt.initial_energy = initial_energy
                nxt.remaining_energy = remaining_energy
                nxt.has_energy_booster = has_energy_booster
 
                queue.append(nxt)
 
    if distance_from_start[rows - 1][cols - 1] == sys.maxsize:
        return -1
    else:
        return distance_from_start[rows - 1][cols - 1]
 
 
print(bfs())

 

posted on   lydstory  阅读(15)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2023-04-26 EXPORT_SYMBOL宏
2021-04-26 $(SolutionDir)
2021-04-26 WDK和 windows sdk
2021-04-26 通过本机winDbg来调试虚拟机中的驱动
2021-04-26 从windows内核开发理解windows的一些程序
2020-04-26 windows sdk 7.1
2020-04-26 m_db=NULL

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示