我正在用python编写我的CIS类的作业。我们必须编写一个数独检查器。在一块9x9的电路板上,我们显然必须检查每一行、每一列和每一块3x3方块中的重复项。我有点纠结于如何用3x3的正方形来检查数字。下面是我检查每一行和每一列的代码,如果有人能帮我一点轮廓或方法,检查每个3x3正方形的东西,那就太棒了!
self.columns = [ ]
for col in range(9):
col_tiles = [ ]
self.columns.append(col_tiles)
for row in range(9):
col_tiles.append(self.tiles[row][col])
self.squares = [ ]
for col in range(1, 10, 3):
for row in range(1, 10, 3):
square_tiles = [ ]
self.squares.append(square_tiles)
for x in range(3):
for y in range(3):
square_tiles.append(self.tiles[x][y])发布于 2012-11-16 13:28:18
这假设您可以自由地读取数据并按照您所需的方式构建结构。我们希望每个行/列/3x3网格都有一组唯一的值1-9,因此一种方法是使用set或列表比较(这里我们将使用set使其更简洁)。如果我们创建一个等于从1到9的数字的集合,我们就有了一个点,我们可以与所有其他组进行比较。假设这样的结构(来自here):
In [1]: r1 = [9,3,2,5,4,8,1,7,6]
In [2]: r2 = [1,8,7,9,2,6,5,4,3]
In [3]: r3 = [5,4,6,3,7,1,2,8,9]
# Continues....其中每一行代表整行数据。现在,让我们创建一个表示前三行的数据部分,拉出一个网格,并将内容与我们的集合进行比较:
In [4]: sec1 = [r1, r2, r3]
In [5]: nums = set(range(1, 10))
In [6]: nums == set(n for row in sec1 for n in row[:3])
Out[6]: True这将遍历前三行,并返回每行中的前三个元素。为了获得更好的视觉效果,下面是等效的for-loop代码,以使其更容易破译:
result = set()
for row in sec1:
for n in row[:3]:
result.add(n)因为我们的数字集包括从1到9的所有内容,所以我们知道它是有效的。为了移动到第二个,我们将row[:3]的范围设置为row[3:6] (然后是row[6:9] )。然后,您还需要在接下来的两个部分中处理此问题。我将把如何将其包装在更动态的结构中留给您(请注意3的倍数),但希望这能帮助您入门:)
发布于 2012-11-16 13:18:05
每当你在想出一个算法时遇到困难时,只要问问自己:“如果我唯一能得到的方法是由计算机来解决这个问题,我该如何手动解决这个问题呢?”
换句话说,如果我让你检查左上角的3x3网格,你的眼睛就会移到左上角,然后把数字加起来。但是如果我说,检查左上角的3x3网格,而实际上没有给你棋盘,你会说,“好的,给我左上角的3x3网格”。
我会说“怎么做?”
你可能会说,“假设这些瓦片是按行和列编号的,我想把瓦片放在点(0,0),(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1)和(2,2)中。”
这有帮助吗?
发布于 2012-11-16 13:13:01
下面是我要做的:创建3个字典,一个用于行,一个用于列,一个用于3x3正方形。
在遍历sudoku拼图中的每个元素时,跟踪您的行和列(微不足道的),并使用if语句来跟踪您所在的3x3方块(稍微复杂一点)
然后只需将每个元素发送到相应的行、列和3x3正方形字典,并在最后进行比较。
这样,您只需要检查每个元素一次。
编辑:另外,set可能会很有用
https://stackoverflow.com/questions/13410733
复制相似问题