度小满4.20笔试第二题城市旅行最小价值BFS

考试的时候忘了一个细节导致一个用例都没过,最后没时间了,考完试才发现忘了题目的下标值不是从0开始的,修改完是可以通过用例的,不知道这样做思路是否正确,有没有大佬指导下?

import sys
from collections import deque


def parse_nums(nums_str):
    return [int(x) for x in nums_str.strip().split()]


def bfs(cs, a, b, c):
    target = len(cs) - 1
    visited = [False] * len(cs)
    queue = deque()
    queue.append((0, 0))
    visited[0] = True
    direcitions = [(0, a), (1, a + c), (-1, a + b)]
    while queue:
        x, t = queue.popleft()
        for d in direcitions:
            nx, nt = cs[x] + d[0], t + d[1]
            if 0 <= nx < len(cs) and not visited[nx]:
                if nx == target:
                    return nt
                queue.append((nx, nt))
                visited[nx] = True
    return -1


for line in sys.stdin:
    n, a, b, c = parse_nums(line)
    cs = parse_nums(input())
    # 忘了写这两行啊啊啊啊
    for i in range(len(cs)):
        cs[i] -= 1
    print(bfs(cs, a, b, c))  # 答案4
#度小满笔试##度小满##笔试题目#
全部评论
我一开始也觉得是bfs,但又觉得bfs不能保证最优解,不知道想的对不对
点赞 回复 分享
发布于 2020-04-20 17:59
bfs可以保证第一次搜索到的是最小的
点赞 回复 分享
发布于 2020-04-20 19:15
我的做法是每一个点记录第一个点到其的位置最小花费,如果直接能从第一个点到达,花费就是a,如果不行,就算通过前面那些位置到他最小花费,记录下来。只过了65
点赞 回复 分享
发布于 2020-04-20 21:08
我做的是回溯法 提交的时候忘记剪枝了
点赞 回复 分享
发布于 2020-04-21 10:19

相关推荐

10-09 09:39
门头沟学院 C++
HHHHaos:这也太虚了,工资就一半是真的
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
09-10 15:43
不想上班蚊不叮在走神:华子是这样的。我投递了,还有其他华子内部人加我,不知道从哪搞的微信号,还要给我打电话劝我改投递方向。直接不鸟就行了
点赞 评论 收藏
分享
1 4 评论
分享
牛客网
牛客企业服务