Python数独检查器

时间:2012-11-16 04:58:02

标签: python sudoku

我正在为python中的CIS类工作。我们必须编写一个数独检查器。在9x9板中,我们显然必须检查每一行,col和3x3平方的重复项。我有点坚持如何用3x3平方检查数字的想法。下面是我检查每一行和col的代码,如果有人可以帮我一点大纲或方法只是检查每个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])

6 个答案:

答案 0 :(得分:2)

这假设您可以自由地阅读数据并构建您想要的结构。对于每行/每列/ 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 - 循环代码,使其更容易破译:

result = set()
for row in sec1:
    for n in row[:3]:
      result.add(n)

由于我们的数字集包括1-9中的所有数字,因此我们知道它是有效的。要移至第二个,我们将row[:3]范围调整为row[3:6](之后为row[6:9])。然后,您还需要为接下来的两个部分处理此问题。我会告诉你如何将它包装在一个更加动态的结构中(注意三个的倍数),但希望这会让你开始:)

答案 1 :(得分:1)

每当你遇到一个算法时遇到问题,只要问问自己:“我如何手动解决这个问题,如果我能解决问题的唯一方法是通过计算机”。

换句话说,如果我要求你检查左上方的3x3网格,你的眼睛就会转到左上角并加上数字。但是,如果我说,检查左上方3x3网格,而实际上没有给你板,你会说,“好的,给我左上3x3网格”。

我会说“怎么样?”

你会说,“想象一下,瓷砖按行和列编号。我希望瓷砖有斑点(0,0),(0,1),(0,2),(1,0), (1,1),(1,2),(2,0),(2,1)和(2,2)“

这有帮助吗?

答案 2 :(得分:0)

这就是我要做的事情:创建3个词典,一个用于行,一个用于列,一个用于3x3方块。

当你遍历数独谜题中的每个元素时,跟踪你的行和列(琐碎),并使用if语句来跟踪你所处的3x3方格(更多涉及)

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

这样你只需要检查一次元素。

编辑:同样,set可能会有用

答案 3 :(得分:0)

这个功能可以。 “sample”给出了随机性,所以每次运行它都会得到一个不同的。

from random import sample
def generate_sudoku_checker():
    random_list = sample([1,2,3,4,5,6,7,8,9],9)
    random_list = random_list + random_list[:9]
    for i in range(3):
        for j in range(3):
            print(random_list[i+j*3:i+j*3+9])

答案 4 :(得分:0)

以下是我的解决方案:

Funtion:

def check_sudoku(lis):
    n = len(lis)
    digit = 1  #start from one
    while (digit<=n):
        i=0
        while i<n:  # go through each row and column
            row_count=0
            column_count=0
            j=0
            while j < n: # for each entry in the row / column
                if lis[i][j] == digit: # check row count
                    row_count = row_count+1
                if lis[j][i]== digit :
                   column_count = column_count+1

             j=j+1
           if row_count !=1 or column_count!=1:
             return False
           i=i+1 # next row/column
        digit = digit+1 #next digit
return True

答案 5 :(得分:0)

聚会迟到了,但这对我有用:

def insert_sudoku():
 puzzle = []
 for i in range(9):
     print("You've entered", len(puzzle), "rows so far")
     row = input("Enter a row")
     if len(row) < 9:
         print("Not enough numbers on this row")
         return insert_sudoku()
     elif len(row) > 9:
         print("Too many numbers. Try again!")
         return insert_sudoku()

    try:
        row = [int(dig) for dig in row]
        puzzle.append(row)
    except:
        print("Whoops, looks like you didn't enter only numbers somewhere. Try again!")
        return insert_sudoku()

validate_entries(puzzle)

def validate_entries(puzzle):

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

 b1, b2, b3, b4, b5, b6, b7, b8, b9 = [], [], [], [], [], [], [], [], []

 for i in range(9):
    z = []
    for x in range(9):
        z.append(puzzle[i][x])
    puzzle.append(z)

 for i in range(3):
    b1 += (puzzle[i][:3])
    b4 += (puzzle[i][3:6])
    b7 += (puzzle[i][6:])

 for i in range(3,6):
    b2 += (puzzle[i][:3])
    b5 += (puzzle[i][3:6])
    b8 += (puzzle[i][6:])

 for i in range(6,9):
    b3 += (puzzle[i][:3])
    b6 += (puzzle[i][3:6])
    b9 += (puzzle[i][6:])

 puzzle.append(b1)
 puzzle.append(b2)
 puzzle.append(b3)
 puzzle.append(b4)
 puzzle.append(b5)
 puzzle.append(b6)
 puzzle.append(b7)
 puzzle.append(b8)
 puzzle.append(b9)

 for iter in puzzle:
     if sorted(iter) != check:
         print("No")
         return

     print("Yes")

 insert_sudoku()

灵感来自this article

编辑:缩进可能会因复制 + 粘贴代码而关闭。