《华为机试》刷题之HJ44 Sudoku

一、题目

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

输入描述:
包含已知数字的9X9盘面数组[空缺位以数字0表示]
输出描述:
完整的9X9盘面数组

二、示例

在这里插入图片描述

三、代码

def is_legal(board, x, y): # 判断填入的数字是否有重复
    for i in range(9): # 判断填入的数字在列中是否有重复
        if i != x and board[i][y] == board[x][y]:
            return False
    for j in range(9): # 判断填入的数字在行中是否有重复
        if j != y and board[x][j] == board[x][y]:
            return False
    m, n = 3*(x // 3), 3*(y // 3) # 计算3x3网格的左上角的坐标
    for i in range(3): # 判断填入的数字在粗线宫内是否有重复
        for j in range(3):
            if (i+m != x or j+n != y) and board[i+m][j+n] == board[x][y]:
                return False
    return True

def dfs(board): # 递归,
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:
                for k in '123456789':
                    board[i][j] = int(k)
                    if is_legal(board, i, j) and dfs(board):
                        return True
                    board[i][j] = 0
                return False # 上一步的数字不合理
    return True # 全部填完

while True:
    try:
        board = []
        for i in range(9):
            board.append(list(map(int, input().split())))
        dfs(board)
        for i in range(9):
            board[i] = list(map(str, board[i]))
            print(' '.join(board[i]))
    except:
        break

四、算法说明

  • 建立函数is_legal(board, x, y),判断填入数字的合法性,判断填入数字所在行、列、粗线宫内是否有重复。
  • 建立函数dfs(board),进行递归,对所有的空格进行遍历,从'123456789'中选择数字,逐个进行递归检验,直到遍历完所有的空格。

胡萝卜

2022年3月21日23:20:54

我不知道将去向何方,但我已在路上!
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 !
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O_胡萝卜_O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值