倒下的多米诺骨牌,调试

2024-06-09 10:35:06 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是我要写的程序:

用户给出了一些domino片段的属性,其中一些是垂直的,一些是水平的,它们位于n行m列中。假设我们从上面观察它们:一个水平多米诺骨牌可以向右或向左倒下,并且只能使其他水平多米诺骨牌倒下。而一个垂直多米诺骨牌可能会向上或向下倒下,只会导致其他垂直多米诺骨牌倒下。你知道吗

首先,用户将给我们行和列的数量作为'nmn',在接下来的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)

对于上面的例子和其他一些我手工编写和计算的例子,它工作得很好。但当我在网站上提交时,我得到了“错误答案!”所有的测试!这有什么问题?你知道吗


Tags: 用户in程序forinput数量ifline
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)

因此,这听起来更像是一个问题,要找出问题在说什么,而不是代码,因为假设每个domino只能知道它们旁边的那些,并且面向同一个方向并不特别困难。有没有可能这个问题实际上更复杂,在两个相像的多米诺骨牌之间打翻一个多米诺骨牌会让多米诺骨牌有一条相互撞击的路径?你知道吗

例如:

3 3
|-|

可能有输出

2

因为,先把中间的多米诺骨牌打翻,就可以把左边的多米诺骨牌打倒右边的多米诺骨牌。你知道吗

相关问题 更多 >