HJ44 题解 | #Sudoku#

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

# 输出函数
def output():
    for i in range(9):
        for j in sudu[i]:
            print(j, end=" ")
        print()
# 检查函数
def check(r, c):  # 参数为当前行列数
    # 检查行内重复,注意检查的时候不要检查自己所处的位置
    for i in range(9):
        if i == c:  # 跳过自己这个位置,不然肯定重复呀
            continue
        else:
            if sudu[r][c] == sudu[r][i]:  # 有重复的
                return False
    # 检查列内重复
    for i in range(9):
        if i == r:  # 跳过自己
            continue
        else:
            if sudu[r][c] == sudu[i][c]:
                return False
    # 检查九宫格
    shang = r // 3 * 3  # 本点所处九宫格最上边的行数
    zuo = c // 3 * 3  # 本点所处九宫格最左边的列数
    for i in range(shang, shang + 3):  # 遍历行
        for j in range(zuo, zuo + 3):  # 遍历列
            if i == r and j == c:  # 跳过自己
                continue
            else:
                if sudu[r][c] == sudu[i][j]:
                    return False
    return True  # 都不重复
# 深搜函数,填写sudu
def dfs():  # 参数为当前行列数
    for i in range(9):
        for j in range(9):
            if sudu[i][j]==0:
                for k in range(1,10):
                    sudu[i][j]=k
                    if check(i,j) and dfs():
                        return True#如果深层有正确结果则不需要继续搜索,返回即可
                    sudu[i][j]=0
                return False#都不行,回溯
    return True#遍历完成即填写成功,返回真
# 输入
sudu = []
for i in range(9):
    sudu.append(list(map(int, input().split())))
# 填空
dfs()
output()

#华为##华为od##华为机试##华为od机试##深搜#
华为HJ103所有解法 文章被收录于专栏

这是我准备华为od面试的专属专栏,我会把自己的解法更新在里面,我会尽量写清楚自己的思路以及多写关键注释,希望对阅读的人有帮助~~~

全部评论

相关推荐

10-30 19:23
已编辑
山东大学(威海) C++
牛至超人:其实简历是不需要事无巨细的写的,让对方知道你有这段经历就行了,最重要的是面试的时候讲细讲明白
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务