我正试图将此列表分割成块



我试图制作一个解决数独的代码,我试图让代码将列表的每个int附加到另一个具有块名称的列表,如Block1和Block2。这里的块是指示例中可见的块。但我就是做不对。我能做到这一点的唯一方法就是使用很多if语句,但必须有更有效的方法。这是列表

Sudoku = [0,3,0, 0,0,0, 0,0,0,
0,0,0, 1,9,5, 0,0,0,
0,0,8, 0,0,0, 0,6,0,

8,0,0,  0,6,0, 0,0,0,
4,0,0,  8,0,0, 0,0,1,
0,0,0,  0,2,0, 0,0,0,

0,6,0,  0,0,0, 2,8,0,
0,0,0,  4,1,9, 0,0,5,
0,0,0,  0,0,0, 0,7,0,]

这是我解决它的尝试

BlockSpins = 0
Multply = 0
three = 3 
for x in range(len(Sudoku) * 8):
three *= Multply
if x >= 0+three and x <=2+three or x >= 9+three and x <=11+three or x >= 18+three and x <=20+three:
BlockSpins += 1
if BlockSpins == 9:
Multply += 1
BlockSpins = 0

如果我们从易于测试的东西开始——一个块中的每个值与该块的索引相匹配的网格——那么想出(和测试)解决方案就会容易一些:

sudoku = [
0,0,0, 1,1,1, 2,2,2,
0,0,0, 1,1,1, 2,2,2,
0,0,0, 1,1,1, 2,2,2,
3,3,3, 4,4,4, 5,5,5,
3,3,3, 4,4,4, 5,5,5,
3,3,3, 4,4,4, 5,5,5,
6,6,6, 7,7,7, 8,8,8,
6,6,6, 7,7,7, 8,8,8,
6,6,6, 7,7,7, 8,8,8,
]

我们的目标是从sudoku列表生成blocks列表的逻辑,这样对于这个测试sudoku,我们满足测试:

assert all(i == v for i, block in enumerate(blocks) for v in block)

对我来说有意义的方法是:

  • 将1D列表转换为2D坐标系统
  • 将这些单元格分组成块,这些块在它们自己的2D空间中
  • 将2D块空间转换为1D块列表

,编码为:

blocks = [[] for _ in range(9)]
for i, v in enumerate(sudoku):
x, y = i % 9, i // 9
b_x, b_y = x // 3, y // 3
blocks[b_x + b_y * 3].append(v)

,这满足了我的测试(没有任何欺骗我的部分-代码不使用v本身来决定如何将值分配给块),所以我很确定它正确工作。:)

使用您的sudoku输入,我们得到以下块:

[
[0, 3, 0, 0, 0, 0, 0, 0, 8],
[0, 0, 0, 1, 9, 5, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 6, 0],
[8, 0, 0, 4, 0, 0, 0, 0, 0],
[0, 6, 0, 8, 0, 0, 0, 2, 0],
[0, 0, 0, 0, 0, 1, 0, 0, 0],
[0, 6, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 4, 1, 9, 0, 0, 0],
[2, 8, 0, 0, 0, 5, 0, 7, 0]
]

最新更新