0
点赞
收藏
分享

微信扫一扫

Python学习笔记 动手实践之数独求所有解

星巢文化 2022-03-13 阅读 23

遇到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)
举报

相关推荐

0 条评论