【发布时间】: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