Escape Pods Google Foobar 挑战 |最大流量问题

Posted

技术标签:

【中文标题】Escape Pods Google Foobar 挑战 |最大流量问题【英文标题】:Escape Pods Google Foobar Challenge | Max Flow Problem 【发布时间】:2020-09-11 11:57:44 【问题描述】:

我处于 google foobar 挑战的第 4 级。我在这个问题上面临问题。我已经在提供的测试用例上尝试了我的解决方案,但谷歌的成绩检查器显示我的代码对于这些测试用例也是错误的。有谁能够帮我?我到底哪里错了?

问题

逃生舱

给定兔子组的起始房间号,逃生舱的房间号,以及在其间的每条走廊的每个方向上一次可以容纳多少只兔子,计算出有多少只兔子可以安全通过在高峰期一次前往逃生舱。

编写一个函数 solution(entrances, exits, path),它接受一个整数数组,表示聚集的兔子组的位置,一个整数数组表示逃生舱所在的位置,以及一个整数数组走廊,以整数形式返回每个时间步可以通过的兔子总数。入口和出口是不相交的,因此永远不会重叠。路径元素 path[A][B] = C 描述了从 A 到 B 的走廊在每个时间步都可以容纳 C 个兔子。最多有 50 个房间由走廊连接,一次最多可以容纳 2000000 只兔子。

例如,如果您有:

entrances = [0, 1]

exits = [4, 5]

path = 

[
[0, 0, 4, 6, 0, 0],  # Room 0: Bunnies

[0, 0, 5, 2, 0, 0],  # Room 1: Bunnies
  
[0, 0, 0, 0, 4, 4],  # Room 2: Intermediate room
  
[0, 0, 0, 0, 6, 6],  # Room 3: Intermediate room
  
[0, 0, 0, 0, 0, 0],  # Room 4: Escape pods
  
[0, 0, 0, 0, 0, 0],  # Room 5: Escape pods
]

那么在每个时间步,可能会发生以下情况: 0 发送 4/4 兔子给 2 和 6/6 兔子给 3 1 发送 4/5 兔子给 2 和 2/2 兔子给 3 2 发送 4/4 兔子给 4 和 4/4 兔子给 5 3 发送 4/6 兔子给 4 和 4/6 兔子给 5

因此,总共有 16 只兔子可以在每个时间步的 4 点和 5 点到达逃生舱。 (请注意,在本例中,房间 3 可以将 8 个兔子的任何变化发送到 4 和 5,例如 2/6 和 6/6,但最终的解决方案保持不变。)

测试用例

您的代码应通过以下测试用例。 请注意,它也可能针对此处未显示的隐藏测试用例运行。

-- Python案例-- 输入:

solution.solution([0], [3], [[0, 7, 0, 0], [0, 0, 6, 0], [0, 0, 0, 8], [9, 0, 0, 0]])

输出:

6

输入:

solution.solution([0, 1], [4, 5], [[0, 0, 4, 6, 0, 0], [0, 0, 5, 2, 0, 0], [0, 0, 0, 0, 4, 4], [0, 0, 0, 0, 6, 6], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]])

输出:

16

我的解决方案

def get_new_path(entrances,exits,path):
    for p in path:
        p.insert(0, 0)
        p.append(0)
    new_length = len(path[0])
    path.insert(0,[0]* new_length)
    path.append([0]* new_length)
    for e in entrances:
        path[0][e+1] = 2e+6
    for e in exits:
        path[e+1][new_length-1] =  2e+6
    return path

def get_route(stack, open, path):
    next = stack[-1]
    list_of_nexts = [i for i,val in enumerate(path[next]) if ( i not in open and val != 0)]
    for i in list_of_nexts:
        open.add(i)
    if len(path)-1 in list_of_nexts:
        stack.append(len(path)-1)
        return stack
    for i in list_of_nexts:
        new_stack = stack.copy()
        new_stack.append(i)
        r = get_route(new_stack, open, path)
        if r == -1: continue
        else: return r
    return -1
    
def solution(entrances, exits, path):
    path = get_new_path(entrances, exits, path)
    flow = 0
    while True:
        stack = [0]
        open = set()
        open.add(0)
        route = get_route(stack, open, path)
        if(route == -1):
            return flow
        else:
            f = min([path[route[i-1]][route[i]] for i in range(1,len(route))])
            for i in range(2,len(route)-1):
                temp = path[route[i-1]][route[i]]
                path[route[i-1]][route[i]] = temp - f
                path[route[i]][route[i-1]] += f
            flow += f    
    return flow

print(solution([0, 1], [4, 5], [[0, 0, 4, 6, 0, 0], [0, 0, 5, 2, 0, 0], [0, 0, 0, 0, 4, 4], [0, 0, 0, 0, 6, 6], [0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0]]))

【问题讨论】:

【参考方案1】:

如果您的解决方案曾经在您自己的计算机上运行但不能在 Foobar 自动评分器上运行,只需知道自动评分器不允许执行一些操作,这会立即导致编译错误:

    任何打印语句:不允许打印语句(实际上是不允许系统输入或输出操作)。通过查看您的代码,您似乎有一个打印语句。摆脱它,然后重试。

    缺少“解决方案”类和方法。如果您在自己的编辑器上编辑文件时不小心更改了类的名称,请务必将其更改回来。

    使用不允许的库。

所有这些规则都可以在自述文件中找到。从外观上看,您在最后一行有一个打印语句,这会自动导致自动评分器中的编译错误。

祝你好运。

【讨论】:

实际上是我添加的打印语句,以便测试人员可以测试我的代码。 所以,澄清一下,您在自己的编译器上得到了一些测试用例的正确答案,但在 Foobar 上,即使这些测试用例也被标记为错误? 是的,事情就是这样。 哦好吧,抱歉我不知道问题出在哪里【参考方案2】:

您使用的 Python 版本不正确。

constraints.txt 文件中有信息:

您的代码将在 Python 2.7.13 沙箱中运行。所有的测试都将 通过调用 solution() 函数运行。

您的代码使用 Python 3 中允许的函数 list.copy()

【讨论】:

以上是关于Escape Pods Google Foobar 挑战 |最大流量问题的主要内容,如果未能解决你的问题,请参考以下文章

python 在Google的Foobar挑战中尝试练习级别3.1“查找访问代码”失败。

python 在Google的Foobar挑战中尝试练习级别3.1“查找访问代码”失败。

Google Foobar 测试用例失败

Google Foobar Challenge,一个测试用例失败

与兔子一起运行的 Google Foobar Level 4 堆栈溢出

Android 构建失败 - java.lang.IllegalArgumentException:已添加:Lcom/google/api/client/escape/CharEscapers;