我试图验证列表中的数字是否已经存在于列矩阵中,但仍在重复。有人能帮我吗?你知道吗
import random
numbers = [1,2,3,4,5,6,7,8,9]
matrix = [[None for i in range(9)] for j in range(9)]
def createMatrix():
for i in range(9):
for j in range(9):
cop = numbers[:]
random.shuffle(cop)
while matrix[i][j] is None:
temp = veriCol(matrix, j, cop)
if temp == 0:
matriz[i] = cop
else:
return None
def veriCol(matrix, col, value):
tmp = 0
for l in range(9):
#print("Vc {}".format(l)),
if value == matrix[l][col]:
tmp = 1
return tmp
createMatrix()
for i in range(9):
print(matriz[i])
除非出于其他目的需要索引,否则不要使用索引循环;使用列表理解和
for .. in
循环。你知道吗如果您的任务是输入数字,以便在任何列中都没有重复的数字,请考虑记住已用完的列。你知道吗
等;为一般情况制定这一点,它更容易您当前的算法。使用集合而不是列表有帮助。你知道吗
您可以为所使用的列值维护一个集合列表。新“洗牌”生产线的验证可以更直接地完成。对于子矩阵组也一样,尽管您需要使用间接(或复杂的索引计算)将位置映射到组集:
如果您试图生成一个随机的拉丁方,一种更快的技术是将工作基线随机化,而不是在试错过程中反复检查随机数集的有效性:
为了解释这一点,最好从一个简单的顺序索引矩阵开始,其中每行比前一行多偏移一个:
如您所见,每一行都有索引0到8(因此没有重复),每一列也有索引0到8,因为偏移而没有重复。你知道吗
现在,如果我们创建一个从1到9的数字列表并对其进行无序排列,我们可以用无序排列列表中相应的数字替换矩阵中的索引。由于每个索引映射到不同的数字,因此生成的矩阵在行或列上不会有任何重复。你知道吗
最后,我们可以洗牌的行得到一个更随机的组织矩阵
以及列:
解决方案(如上)将这些步骤合并到一个列表理解中,但使用完全相同的方法。你知道吗
使用这种方法,也可以产生一个随机数独板(与3x3块约束)。偏移量的公式要复杂一些,行和列的洗牌只能在块组内部和块组之间进行,但总体技术是相同的。你知道吗
这将在0.2毫秒内生成一个随机的9x9数独,而试错法需要1到20秒(非常随机的时间)
与拉丁方技术一样,这是基于一个有效的基线板,该基线板由具有适当行、列和块约束的索引组成:
其余的仅仅是用乱序数字替换索引,以及行、列和块的乱序。你知道吗
相关问题 更多 >
编程相关推荐