【机试题(实现语言:python3)】数独(Sudoku)--递归

题目描述
问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。
例如:
输入
在这里插入图片描述

输出
在这里插入图片描述

输入描述:

包含已知数字的9X9盘面数组[空缺位以数字0表示]

输出描述:

完整的9X9盘面数组

示例1
输入

0 9 2 4 8 1 7 6 3
4 1 3 7 6 2 9 8 5
8 6 7 3 5 9 4 1 2
6 2 4 1 9 5 3 7 8
7 5 9 8 4 3 1 2 6
1 3 8 6 2 7 5 9 4
2 7 1 5 3 8 6 4 9
3 8 6 9 1 4 2 5 7
0 4 5 2 7 6 8 3 1

输出

5 9 2 4 8 1 7 6 3
4 1 3 7 6 2 9 8 5
8 6 7 3 5 9 4 1 2
6 2 4 1 9 5 3 7 8
7 5 9 8 4 3 1 2 6
1 3 8 6 2 7 5 9 4
2 7 1 5 3 8 6 4 9
3 8 6 9 1 4 2 5 7
9 4 5 2 7 6 8 3 1

示例2:
输入:

0 9 5 0 2 0 0 6 0
0 0 7 1 0 3 9 0 2
6 0 0 0 0 5 3 0 4
0 4 0 0 1 0 6 0 7
5 0 0 2 0 7 0 0 9
7 0 3 0 9 0 0 2 0
0 0 9 8 0 0 0 0 6
8 0 6 3 0 2 1 0 5
0 5 0 0 7 0 2 8 3

输出:

def check(matrix, row, col, value):
    """
    检测在(row,col)放value是否合适
    1.每行含1-9,不含重复值value
    2.每列含1-9,不含重复值value
    3.3*3区块含1-9,不含重复值value
    """
    # 检测每行
    for j in range(9):
        if matrix[row][j] == value:
            return False
    # 检测每列
    for i in range(9):
        if matrix[i][col] == value:
            return False
    # 检测元素所在3*3区域
    area_row = (row // 3) * 3
    area_col = (col // 3) * 3
    for i in range(area_row, area_row + 3):
        for j in range(area_col, area_col + 3):
            if matrix[i][j] == value:
                return False
    return True


def solveSudoku(matrix, count=0):
    """
    遍历每一个未填元素,遍历1-9替换为合适的数字
    """
    if (count == 81):  # 递归出口
        return True
    #行优先遍历
    row = count // 9  # 行标
    col = count % 9  # 列标
    if matrix[row][col] != 0:  # 已填充
        return solveSudoku(matrix, count=count + 1)
    else:  # 未填充
        for i in range(1, 10):
            if check(matrix, row, col, i):  # 找到可能的填充数
                matrix[row][col] = i
                if solveSudoku(matrix, count=count + 1):  # 是否可完成
                    return True  # 可完成
                # 不可完成
                matrix[row][col] = 0  # 回溯
        return False  # 不可完成

while True:
    try:
        matrix = []
        for i in range(9):
            matrix.append([int(i) for i in  input().split(' ')])#多维列表输入
        solveSudoku(matrix)
        for i in range(9):
            print( ' '.join(map(str, matrix[i])))
    except:
        break
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
程序说明: Matrix Sudoku Solver 解独矩阵是一款计算模拟人工思路求解数独的程序。它能利用大部分的人工解法完成对简单、等、困难、专家以及骨灰级的数独求解。玩家可以将需要求解的数独输入矩阵后,按照提示或结合逻辑求解,也可以按下自动按钮,让程序帮您完成剩下的求解工作,并在得到正确的求解数独后,自动将求解步骤复制到剪贴板,让您可以在其他文本编辑器粘贴查看,十分的人性化。 功能介绍: 为方便用户使用,本程序分为菜单栏,主界面功能按钮,底部面板提示区。 菜单栏功能介绍: 》选项: 清空:将主界面数独矩阵清空,程序回到初始界面。 读取:读取已存盘的数独文件,并将其显示在主界面数独矩阵。 保存:保存当前主界面数独,将所有值存档。 启用TTS语音提示:该选项可以开启语音提示功能,开启后程序将自动读出程序底部面板提示区的内容。开启前请确认系统是否已安装TTS语音引擎。若没有安装,请到微软TTS官网下载语音引擎。 退出:退出程序 》解题: 锁定已知数:将已填入的初局数独锁定,准备求解。 显示候选数提示:开启后鼠标在某个格子悬停会出现该格可以填入的候选数。 提示值自动填入:开启后按下提示按钮会自动将提示值填入格内。 按步提示:锁定后可用,提示当前数独如何求解 自动解题:锁定后可用,自动求解当前数独。 强制求解:锁定后可用,可对无法用自动求解完成的数独进行强制求解,程序必会返回可解或不可解的结果。 重做:锁定后可用,将所有未锁定的值清空。 》主题: 本程序提供多种主题界面选择,让玩家在自己喜爱的主题求解数独。除了程序自带的五种主题,用户还可以自定义背景,选择自己喜欢的图片作为程序背景。 》帮助: 数独简介:介绍数独由来,发展,规则介绍 程序说明:程序的介绍,程序功能的说明 解法介绍:介绍程序使用及尚未加入的一些数独逻辑求解方法。 关于:程序信息,开发组信息 主界面功能按钮介绍: 提示:同菜单《解题》的《按步提示》 锁定:同菜单《锁定》的《锁定已知数》 保存:同菜单《选项》的《保存》 读取:同菜单《选项》的《读取》 重做:同菜单《解题》的《重做》 清空:同菜单《选项》的《清空》 自动:同菜单《解题》的《自动解题》 提示候选数:同菜单《解题》的《显示候选数提示》 底部面板提示区介绍: 程序求解数独的全部提示信息将全部显示在此处。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值