1

我正在为我的 CIS 类在 python 中分配作业。我们必须编写一个数独检查器。在 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])
4

6 回答 6

2

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

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]之后)。然后,您还需要在接下来的两个部分中处理此问题。我将把它留给你如何将它包装在一个更动态的结构中(注意三的倍数),但希望这会让你开始:)

于 2012-11-16T05:28:17.933 回答
1

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

换句话说,如果我让你检查左上角的 3x3 网格,你的眼睛只会看左上角并加起来。但如果我说,检查左上角的 3x3 网格,实际上并没有给你棋盘,你会说,“好吧,给我左上角的 3x3 网格”。

我会说“怎么样?”

你会说,“想象一下瓷砖按行和列编号。我想要点 (0,0), (0,1), (0,2), (1,0), (1, 1)、(1,2)、(2,0)、(2,1)和(2,2)"

这有帮助吗?

于 2012-11-16T05:18:04.863 回答
0

这是我要做的:创建 3 个字典,一个用于行,一个用于列,一个用于 3x3 方格。

当您遍历数独谜题中的每个元素时,跟踪您的行和列(微不足道),并使用 if 语句来跟踪您所在的 3x3 方格(涉及更多)

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

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

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

于 2012-11-16T05:13:01.007 回答
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])
于 2014-02-28T09:33:52.210 回答
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()

这篇文章的启发

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

于 2021-03-30T22:37:44.813 回答
0

这是我的解决方案:

功能:

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
于 2018-03-27T13:36:28.097 回答