python大作业代码及文档,python大作业代码100行

本文介绍了一段Python代码,使用递归方法解决九宫格填数问题,输入为9x9的二维列表,0表示未知数。函数可以求单个解或所有解,返回解集作为list。
摘要由CSDN通过智能技术生成

大家好,小编来为大家解答以下问题,python大作业代码及文档,python大作业代码100行,现在让我们一起来看看吧!

可读性极高,直接上代码

递归求解

import numpy as np
from copy import deepcopy
def solve_recursion(pad, only_one_solve=True):
    '''递归求法'''
    pad = deepcopy(pad)
    pad = np.array(pad)
    pos = [-1, -1]  # 用来存放第一个未知数的位置
    possible = []  # 第一个未知数的位置可能的取值
    solves = []  # 解集
    if pad.max() > 9 or pad.min() < 0 or pad.shape != (9, 9):  # 异常保护
        raise ValueError("wtf with input value?")
    for y in range(9):  # 得到第一个未知数的位置
        if pos[0] != -1 and pos[1] != -1:  # 如果已经找到第一个未知数的位置
            break
        for x in range(9):
            if pad[y][x] == 0:
                pos = [x, y]
                break
    if pos[0] == -1 and pos[1] == -1:  # 第一个未知数的位置没找到,说明已经没有未知数了,已经解完
        print("find")
        return [pad]
    for k in range(1, 9 + 1):
        x = pos[0]
        y = pos[1]
        # 这一行内是否有k
        row = pad[y, :]
        if k in row:
            continue
        # 这一列内是否有k
        col = pad[:, x]
        if k in col:
            continue
        # 九宫格内是否有k
        box = pad[y - y % 3:y - y % 3 + 3, x - x % 3:x - x % 3 + 3]  # 切片出九宫格
        if k in box:
            continue
        possible.append(k)  # 这个位置为k时与当前已知情况不冲突
    if len(possible) == 0:  # 填什么都不满足当前的情况,无解
        return None
    for i in range(len(possible)):
        y = pos[1]
        x = pos[0]
        pad[y][x] = possible[i]  # 假设这个位置的数
        ret = solve_recursion(pad, only_one_solve=only_one_solve)  # 递归求解
        if ret is None:  # 无解
            pass
        elif isinstance(ret, list) and len(ret) == 0:  # 还没有解
            pass
        else:  # 解集
            if only_one_solve:
                return ret
            for j in range(len(ret)):
                solves.append(ret[j])
    return solves

传入参数:
pad,9x9二维list,pad[y][x]即x,y处对应的值,0表示未知,1-9对应1-9。
only_one_solve:True:求到一个解就直接中断求解,False:求完所有的解
返回值:
solves:解集list

求解所谓世界最难数独
求解所谓世界最难数独

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值