吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2110|回复: 4
收起左侧

[Python 转载] python回溯算法解数独

[复制链接]
0821fzh 发表于 2021-3-13 23:28
记录使用回溯算法解析数独

# 数独计算
import copy


def sudoku_analyze(board):
    def isValid(board, r, c, n):
        for i in range(9):

            if board[r] == n:
                return False

            if board[c] == n:
                return False

            if board[int(r / 3) * 3 + int(i / 3)][int(c / 3) * 3 + i % 3] == n:
                return False
        return True

    def backtrack(board, i, j):
        m, n = 9, 9

        if j == n:
            return backtrack(board, i + 1, 0)

        if i == m:
            return True

        if board[j] != 0:
            return backtrack(board, i, j + 1)

        for ch in range(1, 10):
            if not isValid(board, i, j, ch):
                continue

            board[j] = ch

            if backtrack(board, i, j + 1):
                return True

            board[j] = 0

        return False

    backtrack(board, 0, 0)


# array = [[-1] * 9 for _ in range(9)]# 输入的数独矩阵
array = [
    [0, 0, 0, 6, 0, 4, 7, 0, 0],
    [7, 0, 6, 0, 0, 0, 0, 0, 9],
    [0, 0, 0, 0, 0, 5, 0, 8, 0],
    [0, 7, 0, 0, 2, 0, 0, 9, 3],
    [8, 0, 0, 0, 0, 0, 0, 0, 5],
    [4, 3, 0, 0, 1, 0, 0, 7, 0],
    [0, 5, 0, 2, 0, 0, 0, 0, 0],
    [3, 0, 0, 0, 0, 0, 2, 0, 8],
    [0, 0, 2, 3, 0, 1, 0, 0, 0],
]

array_copy = copy.deepcopy(array)
sudoku_analyze(array_copy)

for i in range(9):

    print("\033[1;30m", end='')  # 白色
    if i % 3 == 0:
        # print('=' * line)
        print('++===+===+===++===+===+===++===+===+===++')
    else:
        print('++---+---+---++---+---+---++---+---+---++')

    for j in range(9):

        print("\033[1;30m", end='')  # 白色
        if j % 3 == 0:
            print('||', end='')
        else:
            print('|', end='')

        print(' ', end='')
        if array[j] == array_copy[j]:
            print("\033[1;37m", end='')  # 红色
        else:
            print("\033[1;31m", end='')  # 灰色

        print(array_copy[j], end='')

        print(' ', end='')

    print("\033[1;30m", end='')  # 白色
    print('||', end='')
    print()

print('=' * line)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Pau250 发表于 2021-3-13 23:37
支持一下楼主
别吵我搞设计啊 发表于 2021-3-13 23:45
hqt 发表于 2021-3-14 00:28
kav521 发表于 2021-3-14 02:10
学习了,支持你哦。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表