【问题标题】:falling dominoes, debugging倒下的多米诺骨牌,调试
【发布时间】:2018-07-25 12:59:19
【问题描述】:

这是我正在尝试编写的程序:

用户给出了一些骨牌的属性,其中一些是垂直的,一些是水平的,它们在 n 行 m 列中。假设我们从上面看它们:一个水平的多米诺骨牌可以向右或向左倒下,只能使其他水平的多米诺骨牌倒下。一个垂直的多米诺骨牌可以向上或向下倒下,只能导致其他垂直的多米诺骨牌倒下。

首先用户将给我们行数和列数为'n m',然后在接下来的n行输入中,用户将给出每行由m个字符组成的行,例如m=5:|| -|- '|'代表水平的,“-”代表垂直的多米诺骨牌。

现在该程序应该确定我们必须推动以使它们全部倒下的最小多米诺骨牌数量。

这是问题中提出的示例:

输入:

3 3
|||
||-
||-

输出:

4

我们在每一行推第一个多米诺骨牌,在第三列推第二个多米诺骨牌(从左到右)

这是我的代码:

dim = input()
n, m = [int(i) for i in dim.split(' ')]
min_d = 0
vertical = []
for q in range(0, m):
    vertical.append(n)

for j in range(0, n):
    line = list(input())
    # horizontal:
    if line[0] == '|':
        min_d += 1
    for l in range(1, m):
        if line[l] == '|':
            if line[l-1] == '-':
                min_d += 1
    # vertical:
    if j == 0:
        for k in range(0, m):
            if line[k] == '-':
                min_d += 1
                vertical[k] = 0
    if j > 0:
        for p in range(0, m):
            if line[p] == '-':
                if vertical[p] != j-1:
                    min_d += 1
                vertical[p] = j

print(min_d)

它适用于上述示例和我手动编写和计算的其他一些示例。但是当我在网站上提交这个时,我得到“错误的答案!”所有的测试!这有什么问题?

【问题讨论】:

  • WRONG ANSWER! 给了你什么?
  • for q in range(0, m): vertical.append(n) 这只会给你[3,3,3]
  • 由于您需要担心垂直多米诺骨牌以及一次解析输入一行是行不通的,因为我们关心另一行的内容。在开始检查需要推送多少多米诺骨牌之前制作二维数组
  • 我这样做是为了使用更少的内存,并且 [3, 3, 3] 没有问题。我只是想用 >= m 的数字填充列表。
  • @Mitchel0022 我认为你错了。 vertical 数组标记输入矩阵前一行中相应列的单元格的标识。该方法是可行的,因为当沿着一列或一行扫描时只需要跟踪符号的变化。 vertical 条目保存前一行的索引,并在遇到 h 对齐的多米诺骨牌时更新。如果没有,vertical 条目此后将“落后”,在下一个“-”处触发另一个增量。 vertical 是用行数初始化的,这个值永远不能成为合法的身份标记。

标签: python python-3.x algorithm debugging


【解决方案1】:

所以听起来这更像是找出问题在说什么而不是代码的问题,假设每个多米诺骨牌只能知道它们直接相邻并且面向相同方向的多米诺骨牌是不是特别难。有没有可能这个问题实际上更复杂,在两个相似的多米诺骨牌之间打翻多米诺骨牌可以让多米诺骨牌互相撞击?

例如:

3 3
|-|

可能有输出

2

因为,先把中间的多米诺骨牌撞倒,才能把左边的骨牌撞到右边的骨牌上。

【讨论】:

    【解决方案2】:

    如果您将初始“矩阵”转换为字符串,则可以计算-| 的出现次数,以找出需要进行多少垂直推动。

    然后您可以使用|- 的出现在列上执行相同的操作。

    类似:

    import re
    
    matrix = (
        "|||-"
        "||--"
        "||--"
    )
    # Size of matrix
    x = 3
    y = 4
    min_push = 0
    
    # By line
    regline = re.compile("-\|")
    for i in range(0, x*y, y):
        current_line = matrix[i:i+y]
        if current_line[0] == "|":
            min_push += 1
        min_push += len(re.findall(regline, current_line))
    
    # Turn the "matrix" string by 90° so columns become lines
    matrix_tmp = [ "" for i in range(y) ]
    for i in range(x*y):
        matrix_tmp[i%y] += matrix[i]
    
    matrix = "".join(matrix_tmp)
    
    # By column
    regline = re.compile("\|-")
    for i in range(0, x*y, x):
        current_col = matrix[i:i+x]
        if current_col[0] == "-":
            min_push += 1
        min_push += len(re.findall(regline, current_col))
    
    print(min_push)
    

    【讨论】:

    • 谢谢,在我测试时它工作得很好,但我再次从网站上得到了同样的错误。现在我完全确定该站点存在问题。 @扑通
    • 我想你在谈论一个像codingchallenge这样的网站(不知道这个是否仍然存在),他们不提供失败测试的输入吗?还是错误信息?对我来说,通常是格式化输出有问题(或者一些奇怪的情况,比如空输入,或者在你的情况下是单行输入,我没有尝试过)
    • 这是一个本地网站,不,它不显示输入,只定义最大值,在这种情况下为 n,m
    猜你喜欢
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多