一直在制作数独区块值列表?[Python]

2024-09-19 02:53:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图列出给定字谜长度N的数独子块索引集。下面的图表也许能更好地说明我的意思

00 01 02|03 04 05|06 07 08 
09 10 11|12 13 14|15 16 17 
18 19 20|21 22 23|24 25 26
--------+--------+-------- 
27 28 29|30 31 32|33 34 35 
36 37 38|39 40 41|42 43 44 
45 46 47|48 49 50|51 52 53
--------+--------+--------
54 55 56|57 58 59|60 61 62 
63 64 65|66 67 68|69 70 71 
72 73 74|75 76 77|78 79 80

9x9数独网格最左上方子块的集合看起来像{0,1,2,9,10,11,18,19,20}

然而,到目前为止,我一直在硬编码这些子块,它们只适用于9x9拼图。我想写一个函数来创建任何NxN拼图的集合列表,但是我被卡住了

以下是我目前的代码:

  finalList = []
  subblockList = [[] for i in range(27)]
  for i in range(9):
    for j in range(3):
      subblockList[i].append(i * 9 + j)
    for j in range(3):
      subblockList[i + 9].append(i * 9 + 3 + j)
    for j in range(3):
      subblockList[i + 18].append(i * 9 + 6 + j)
  for i in range(0, 27, 3):
    finalList.append(set(subblockList[i] + subblockList[i + 1] + subblockList[i + 2]))
  print(finalList)

Tags: 函数in网格编码for图表range子块
1条回答
网友
1楼 · 发布于 2024-09-19 02:53:58

我假设我们想把N^2xn^2的网格分成N^2个子网格,每个子网格都是N^2xn^2。对于N=3,我们将9x9网格分成9个子网格,以此类推

这个问题不是关于Python的,但是熊猫可以提供一个简洁的答案

import numpy as np
import pandas as pd
N=3 # test as in standard sudoku
cols = list(range(N*N))
idx  = list(range(N*N))
data = np.array(range(N**4)).reshape((N**2, N**2))
df = pd.DataFrame(columns = cols - np.mod(cols,N), data = data, index = idx - np.mod(idx,N))

这将创建一个9x9网格,该网格按3组索引:

|    |   0 |   0 |   0 |   3 |   3 |   3 |   6 |   6 |   6 |
| -:|  :|  :|  :|  :|  :|  :|  :|  :|  :|
|  0 |   0 |   1 |   2 |   3 |   4 |   5 |   6 |   7 |   8 |
|  0 |   9 |  10 |  11 |  12 |  13 |  14 |  15 |  16 |  17 |
|  0 |  18 |  19 |  20 |  21 |  22 |  23 |  24 |  25 |  26 |
|  3 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  35 |
|  3 |  36 |  37 |  38 |  39 |  40 |  41 |  42 |  43 |  44 |
|  3 |  45 |  46 |  47 |  48 |  49 |  50 |  51 |  52 |  53 |
|  6 |  54 |  55 |  56 |  57 |  58 |  59 |  60 |  61 |  62 |
|  6 |  63 |  64 |  65 |  66 |  67 |  68 |  69 |  70 |  71 |
|  6 |  72 |  73 |  74 |  75 |  76 |  77 |  78 |  79 |  80 |

现在我们进行堆栈,使列索引成为行的子索引,然后分组

df2 = df.stack()
df2 = df2.groupby(df2.index)

最后,我们提取子网格

subgrids = [list(grp[1].values) for grp in df2]
subgrids

这是我们得到的

[[0, 1, 2, 9, 10, 11, 18, 19, 20],
 [3, 4, 5, 12, 13, 14, 21, 22, 23],
 [6, 7, 8, 15, 16, 17, 24, 25, 26],
 [27, 28, 29, 36, 37, 38, 45, 46, 47],
 [30, 31, 32, 39, 40, 41, 48, 49, 50],
 [33, 34, 35, 42, 43, 44, 51, 52, 53],
 [54, 55, 56, 63, 64, 65, 72, 73, 74],
 [57, 58, 59, 66, 67, 68, 75, 76, 77],
 [60, 61, 62, 69, 70, 71, 78, 79, 80]]

相关问题 更多 >