遇到2个问题到现在还没搞明白的问题,有大佬能解惑吗?
1.下面第2个函数为什么会多个 1 出来?
can_choose_keys(0, 0, M) ,M数组就是代码里的那个。
def can_choose_keys(row, col, MATRIX):
allkeys = keys_of_row(row, col, MATRIX) + keys_of_col(row,col, MATRIX) + keys_of_block(row, col, MATRIX)
keys = set(ANSWER_KEYS) - set(allkeys)
return keys
返回的是正常的 {2, 4, 5, 6, 8}
def can_choose_keys(row, col, MATRIX):
keys = set(ANSWER_KEYS) -set(keys_of_row(row, col, MATRIX)+keys_of_row(row,col, MATRIX) + keys_of_block(row, col, MATRIX))
return keys
返回的确实是 {1, 2, 4, 5, 6, 8}
2.这样的情况有办法return回列表吗?给其他函数调用
def get_all_results(MATRIX, RESULTS_LIST) 中 要把所有的可能全部跑一遍,最后一个坐标,又是keys中最后一个值正确的概率几乎没有,所有永远是return False。没有办法return回解的列表。不知道有没有大佬能给个办法。现在只能print出来。
全部代码如下:
# 数独求解
# 获取当前坐标对应所有 行 的值
def keys_of_row(row, col, MATRIX):
keys_row = []
for cols in range(9):
keys_row.append(MATRIX[row][cols])
return keys_row
# 获取当前坐标对应所有 列 的值
def keys_of_col(row, col, MATRIX):
keys_col = []
for rows in range(9):
keys_col.append(MATRIX[rows][col])
return keys_col
# 获取当前坐标对应所有 块 的值
def keys_of_block(row, col, MATRIX):
keys_block = []
for row_fix in range(3):
for col_fix in range(3):
keys_block.append(MATRIX[row//3*3+row_fix][col//3*3+col_fix])
return keys_block
# 删除当前坐标对应所有 行 块 列 的值后,取得可用的值
def can_choose_keys(row, col, MATRIX):
# 不知道为什么下面这条会在 can_choose_keys(0, 0, M) 是个 1
# keys = set(ANSWER_KEYS) -set(keys_of_row(row, col, MATRIX)+keys_of_row(row,col, MATRIX) + keys_of_block(row, col, MATRIX))
allkeys = keys_of_row(row, col, MATRIX) + keys_of_col(row,
col, MATRIX) + keys_of_block(row, col, MATRIX)
keys = set(ANSWER_KEYS) - set(allkeys)
return keys
# 数独求单一解
def get_result(MATRIX):
for row in range(9):
for col in range(9):
if MATRIX[row][col] == 0:
keys = can_choose_keys(row, col, MATRIX)
for key in keys:
MATRIX[row][col] = key
if get_result(MATRIX):
return MATRIX
else:
MATRIX[row][col] = 0
return False
return MATRIX
# 数独求全部解
def get_all_results(MATRIX, RESULTS_LIST):
for row in range(9):
for col in range(9):
if row == 8 and col == 8 and MATRIX[row][col] > 0:
RESULTS_LIST.append(MATRIX)
print("数独的第", len(RESULTS_LIST), "个解")
for j in RESULTS_LIST[len(RESULTS_LIST)-1]:
print(j)
if MATRIX[row][col] == 0:
keys = can_choose_keys(row, col, MATRIX)
for key in keys:
MATRIX[row][col] = key
if not get_all_results(MATRIX, RESULTS_LIST):
MATRIX[row][col] = 0
return False
def check_result(MATRIX):
msg = "好像没有错"
for i in get_result(MATRIX):
if sum(i) != 45:
msg = "ERROR"
a = list(zip(*get_result(MATRIX)))
for j in a:
if sum(i) != 45:
msg = "ERROR"
print(msg)
if msg == "好像没有错":
return True
def check_all_result(MATRIX):
msg = "好像没有错"
for i in MATRIX:
if sum(i) != 45:
msg = "ERROR"
a = list(zip(*MATRIX))
for j in a:
if sum(i) != 45:
msg = "ERROR"
print(msg)
if msg == "好像没有错":
return True
RESULTS_LIST = []
ANSWER_KEYS = {1, 2, 3, 4, 5, 6, 7, 8, 9}
# https://www.sudoku.name/index.php?ln=cn&puzzle_num=24245&play=1&difficult=4&timer=1&time_limit=0
M = [
[0, 0, 3, 0, 9, 0, 0, 0, 0],
[0, 0, 0, 3, 0, 0, 5, 8, 0],
[7, 0, 0, 0, 0, 8, 2, 0, 0],
[0, 8, 0, 0, 5, 0, 1, 0, 0],
[1, 0, 0, 9, 7, 4, 0, 0, 2],
[0, 0, 6, 0, 8, 0, 0, 4, 0],
[0, 2, 0, 4, 0, 0, 0, 0, 6],
[0, 6, 1, 0, 0, 5, 0, 0, 0],
[0, 0, 0, 0, 2, 0, 3, 0, 0],
]
M_KEY = [
[8, 5, 3, 2, 9, 1, 6, 7, 4],
[6, 1, 2, 3, 4, 7, 5, 8, 9],
[7, 9, 4, 5, 6, 8, 2, 1, 3],
[4, 8, 9, 6, 5, 2, 1, 3, 7],
[1, 3, 5, 9, 7, 4, 8, 6, 2],
[2, 7, 6, 1, 8, 3, 9, 4, 5],
[3, 2, 8, 4, 1, 9, 7, 5, 6],
[9, 6, 1, 7, 3, 5, 4, 2, 8],
[5, 4, 7, 8, 2, 6, 3, 9, 1]
]
M2 = [
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
]
M4 = [
[0, 0, 0, 2, 0, 0, 1, 0, 0],
[8, 0, 0, 0, 0, 6, 0, 3, 0],
[0, 0, 0, 0, 0, 1, 7, 5, 0],
[0, 0, 0, 5, 0, 0, 4, 0, 0],
[0, 7, 5, 0, 0, 0, 6, 2, 0],
[0, 0, 2, 0, 0, 3, 0, 0, 0],
[0, 5, 4, 7, 0, 0, 0, 0, 0],
[0, 2, 0, 6, 0, 0, 0, 0, 9],
[0, 0, 6, 0, 0, 9, 0, 0, 0]]
M3 = [
[8, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 3, 6, 0, 0, 0, 0, 0],
[0, 7, 0, 0, 9, 0, 2, 0, 0],
[0, 5, 0, 0, 0, 7, 0, 0, 0],
[0, 0, 0, 8, 4, 5, 7, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 3, 0],
[0, 0, 1, 0, 0, 0, 0, 6, 8],
[0, 0, 8, 5, 0, 0, 0, 1, 0],
[0, 9, 0, 0, 0, 0, 4, 0, 0]
]
#############################################################################################
# PRINT TEST ZONE #
get_all_results(M4, RESULTS_LIST)