这是我要编写的程序:
用户提供了一些多米诺骨牌的属性,其中一些是垂直的,一些是水平的,它们分别在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)
,它对于上面的示例以及我手工制作和计算的其他一些示例都可以正常工作。但是,当我在网站上提交此内容时,我得到“错误答案!”对于所有测试!怎么了?
答案 0 :(得分:1)
因此,听起来似乎这比找出问题在说什么而不是代码要解决的多,这是假设每个多米诺骨牌只能知道紧挨着它们并面对相同方向的那个是并不特别困难。问题是否可能实际上更复杂,并且敲打两个相似的面对多米诺骨牌之间的多米诺骨牌可能会为多米诺骨牌相互碰撞提供一条路径?
例如:
3 3
|-|
可能有输出
2
因为,首先将中间的多米诺骨牌撞倒,可以将左侧的多米诺骨牌撞成右侧的多米诺骨牌。
答案 1 :(得分:0)
如果将初始的“矩阵”转换为字符串,则可以计算-|
的出现次数,以找到需要执行的垂直推入次数。
然后您可以使用|-
的出现在列上执行相同的操作。
类似的东西:
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)