首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python数独跳棋

Python数独跳棋
EN

Stack Overflow用户
提问于 2012-11-16 12:58:02
回答 6查看 5.8K关注 0票数 1

我正在用python编写我的CIS类的作业。我们必须编写一个数独检查器。在一块9x9的电路板上,我们显然必须检查每一行、每一列和每一块3x3方块中的重复项。我有点纠结于如何用3x3的正方形来检查数字。下面是我检查每一行和每一列的代码,如果有人能帮我一点轮廓或方法,检查每个3x3正方形的东西,那就太棒了!

代码语言:javascript
复制
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])
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-11-16 13:28:18

这假设您可以自由地读取数据并按照您所需的方式构建结构。我们希望每个行/列/3x3网格都有一组唯一的值1-9,因此一种方法是使用set或列表比较(这里我们将使用set使其更简洁)。如果我们创建一个等于从1到9的数字的集合,我们就有了一个点,我们可以与所有其他组进行比较。假设这样的结构(来自here):

代码语言:javascript
复制
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....

其中每一行代表整行数据。现在,让我们创建一个表示前三行的数据部分,拉出一个网格,并将内容与我们的集合进行比较:

代码语言:javascript
复制
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代码,以使其更容易破译:

代码语言:javascript
复制
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的倍数),但希望这能帮助您入门:)

票数 2
EN

Stack Overflow用户

发布于 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)中。”

这有帮助吗?

票数 1
EN

Stack Overflow用户

发布于 2012-11-16 13:13:01

下面是我要做的:创建3个字典,一个用于行,一个用于列,一个用于3x3正方形。

在遍历sudoku拼图中的每个元素时,跟踪您的行和列(微不足道的),并使用if语句来跟踪您所在的3x3方块(稍微复杂一点)

然后只需将每个元素发送到相应的行、列和3x3正方形字典,并在最后进行比较。

这样,您只需要检查每个元素一次。

编辑:另外,set可能会很有用

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13410733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档