我正在为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])
答案 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
编辑:缩进可能会因复制 + 粘贴代码而关闭。