如何在 Python 中生成所有不同的 3x3 拉丁方的列表
How to generate a list of all distinct 3x3 Latin Square in Python
拉丁方块是一个 nxn 数组,其中填充了 n 个不同的符号,每个符号在每一行中恰好出现一次,在每一列中恰好出现一次(例如数独)。拉丁方的例子:
1 2 3
2 3 1
3 1 2
这是我试过的方法,但仍然不是很清楚
grid = []
temp = []
block = [[1,2,3],
[2,3,1],
[3,1,2]]
perm = permutations(block)
for i in perm: #row permutations
temp.extend(i)
if len(temp)==3:
grid.extend([temp])
temp = []
for perm in zip(permutations(block[0]), permutations(block[1]), permutations(block[2])): #column permutations
temp.extend([perm])
for i in range(len(temp)): #convert to list
temp[i] = list(temp[i])
for j in range(len(temp[0])):
temp[i][j] = list(temp[i][j])
grid.extend(temp)
for i in grid:
for j in i:
print(j)
print()
输出为:
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 1, 2]
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
[3, 2, 1]
[2, 1, 3]
[1, 3, 2]
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 1, 3]
[1, 3, 2]
[3, 2, 1]
结果应该是这样的(顺序无关紧要):Latin Square
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[1, 3, 2]
[2, 1, 3]
[3, 2, 1]
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
[2, 1, 3]
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
[3, 2, 1]
[1, 3, 2]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 2, 1]
[1, 3, 2]
[2, 1, 3]
[3, 2, 1]
[2, 1, 3]
[1, 3, 2]
[3, 1, 2]
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
您可以对生成器使用递归:
def row(n, r, c = []):
if len(c) == n:
yield c
for i in range(1, n+1):
if i not in c and i not in r[len(c)]:
yield from row(n, r, c+[i])
def to_latin(n, c = []):
if len(c) == n:
yield c
else:
for i in row(n, [[]]*n if not c else list(zip(*c))):
yield from to_latin(n, c+[i])
for i in to_latin(3):
for b in i:
print(b)
print('-'*9)
输出:
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
---------
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
---------
[1, 3, 2]
[2, 1, 3]
[3, 2, 1]
---------
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
---------
[2, 1, 3]
[1, 3, 2]
[3, 2, 1]
---------
[2, 1, 3]
[3, 2, 1]
[1, 3, 2]
---------
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
---------
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
---------
[3, 1, 2]
[1, 2, 3]
[2, 3, 1]
---------
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
---------
[3, 2, 1]
[1, 3, 2]
[2, 1, 3]
---------
[3, 2, 1]
[2, 1, 3]
[1, 3, 2]
---------
拉丁方块是一个 nxn 数组,其中填充了 n 个不同的符号,每个符号在每一行中恰好出现一次,在每一列中恰好出现一次(例如数独)。拉丁方的例子:
1 2 3
2 3 1
3 1 2
这是我试过的方法,但仍然不是很清楚
grid = []
temp = []
block = [[1,2,3],
[2,3,1],
[3,1,2]]
perm = permutations(block)
for i in perm: #row permutations
temp.extend(i)
if len(temp)==3:
grid.extend([temp])
temp = []
for perm in zip(permutations(block[0]), permutations(block[1]), permutations(block[2])): #column permutations
temp.extend([perm])
for i in range(len(temp)): #convert to list
temp[i] = list(temp[i])
for j in range(len(temp[0])):
temp[i][j] = list(temp[i][j])
grid.extend(temp)
for i in grid:
for j in i:
print(j)
print()
输出为:
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 1, 2]
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
[3, 2, 1]
[2, 1, 3]
[1, 3, 2]
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 1, 3]
[1, 3, 2]
[3, 2, 1]
结果应该是这样的(顺序无关紧要):Latin Square
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[1, 3, 2]
[2, 1, 3]
[3, 2, 1]
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
[2, 1, 3]
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
[3, 2, 1]
[1, 3, 2]
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
[3, 2, 1]
[1, 3, 2]
[2, 1, 3]
[3, 2, 1]
[2, 1, 3]
[1, 3, 2]
[3, 1, 2]
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
您可以对生成器使用递归:
def row(n, r, c = []):
if len(c) == n:
yield c
for i in range(1, n+1):
if i not in c and i not in r[len(c)]:
yield from row(n, r, c+[i])
def to_latin(n, c = []):
if len(c) == n:
yield c
else:
for i in row(n, [[]]*n if not c else list(zip(*c))):
yield from to_latin(n, c+[i])
for i in to_latin(3):
for b in i:
print(b)
print('-'*9)
输出:
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
---------
[1, 2, 3]
[3, 1, 2]
[2, 3, 1]
---------
[1, 3, 2]
[2, 1, 3]
[3, 2, 1]
---------
[1, 3, 2]
[3, 2, 1]
[2, 1, 3]
---------
[2, 1, 3]
[1, 3, 2]
[3, 2, 1]
---------
[2, 1, 3]
[3, 2, 1]
[1, 3, 2]
---------
[2, 3, 1]
[1, 2, 3]
[3, 1, 2]
---------
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
---------
[3, 1, 2]
[1, 2, 3]
[2, 3, 1]
---------
[3, 1, 2]
[2, 3, 1]
[1, 2, 3]
---------
[3, 2, 1]
[1, 3, 2]
[2, 1, 3]
---------
[3, 2, 1]
[2, 1, 3]
[1, 3, 2]
---------