题解 | #Sudoku#

Sudoku

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

def find0(ls):
    res = []
    for i in range(9):
        for j in range(9):
            if ls[i][j]==0:
                pos = [i,j]
                res.append([pos,find_vacancy(pos,ls)])
    return res
def find_vacancy(pos,ls):
    i = pos[0]
    j = pos[1]
    row = ls[i]
    cross = [line[j] for line in ls]
    i = i-i%3
    j = j-j%3
    squre = []
    for line in ls[i:i+3]:
        squre += line[j:j+3]
    helper = list(set(row+cross+squre))
#     print(helper)
    res = []
    for item in range(1,10):
        if item not in helper:
            res.append(item)
    return res

def clear_data(cur,ls):
    for i in range(len(cur)):
        vacancy = cur[i][1]
        relatives1 = set()
        relatives2 = set()
        relatives3 = set()
        temp1 = []
        temp2 = []
        temp3 = []
        for j in range(len(cur)):
            if cur[i][0][0] == cur[j][0][0]:
                for item in cur[j][1]:
                    relatives1.add(item)
            elif cur[i][0][1] == cur[j][0][1]:
                for item in cur[j][1]:
                    relatives2.add(item)
            if (cur[i][0][1]//3 == cur[j][0][1]//3 and cur[i][0][1]//3 == cur[j][0][1]//3):
                for item in cur[j][1]:
                    relatives3.add(item)
        for item in vacancy:
            if item not in relatives1:
                temp1.append(item)
            if item not in relatives2:
                temp2.append(item)
            if item not in relatives2:
                temp3.append(item)
#         temp = temp1&temp2&temp3
        if len(temp1) == 1:
            cur[i][1] = temp1
            break
        if len(temp2) == 1:
            cur[i][1] = temp2
            break
        if len(temp3) == 1:
            cur[i][1] = temp3
            break

ls = []
for i in range(9):
    ls.append(list(map(int,input().split())))

while True:
    cur = sorted(find0(ls),key = lambda x:len(x[1]))
#     print(cur)
    if len(cur)==0:
        break
    if len(cur[0][1]) != 1:
#         print(cur)
        clear_data(cur,ls)
        cur = sorted(cur,key = lambda x:len(x[1]))
#         print(cur)
        ls[cur[0][0][0]][cur[0][0][1]] = cur[0][1][0]
        cur = cur[1:]
        continue
    while len(cur)!=0 and len(cur[0][1]) == 1:
        ls[cur[0][0][0]][cur[0][0][1]] = cur[0][1][0]
        cur = cur[1:]
for i in range(9):
    for j in range(9):
        print(ls[i][j],end=' ')
    print()

一上来没有考虑遍历,想着按照我做数独的顺序,先把每个空可以填的值找出来,按可选值数量排好序,对于只有一个可选值的直接填上,没有唯一可选值之后更新数独循环,当出现多个可选值时,与该格相关的行、列、3*3分别判断,比如:[0,1] [0,2] [0,3] 可填只有 4,5,6,而在第2列、第3列分别都有4,所以4只能填在[0,1]的位置,没有从最开始确定可选值的时候就用上这个函数因为计算量比较大容易超(用字典尝试先把空格分好组可能会好些)。
效率惨不忍睹,每个格子信息写成一个类可能会清晰很多,三个函数第一个是找到所有0,第二个是找到每个0对应的能够填的未被占用的值,第三个函数为找到必须填的值(分别从行、列、3*3里面找)。

全部评论

相关推荐

12-07 10:09
复旦大学 Java
点赞 评论 收藏
分享
已经入职数字马力4个月了,忍不住想和大家聊聊最真实的感受!🔥1️⃣ 岗位偏见?作为蚂蚁的子公司,很多人会担心“内包”身份会不会有岗位偏见。就我这几个月的体验来说,数字马力一直在快速扩招,面试流程也越来越规范(尤其是校招环节)。至于偏见问题,真的看部门和leader,很幸运我遇到的师兄和主管都特别nice,团队氛围很融洽。2️⃣ 待遇怎么样?试用期工资不打折!这点我真的吹爆💥!每天六点下班还有餐补,公积金按全额8%交(感动哭)……不过养老金也是实打实的8%,到手稍微心疼一下下😂3️⃣ 技术栈跟得上吗?技术栈多到学不完……而且我们有权限访问蚂蚁的知识库,自学能力强+愿意钻研的话,成长速度真的飞快!(当然,像我这种偶尔偷懒的也在慢慢进步中😝)4️⃣ 面试流程?一般是三面:两轮技术面(可能有线上笔试)+ 一轮HR面(含背调)。整体节奏比较顺畅,反馈也及时。5️⃣ 未来发展怎么看?老实说,数字马力不算头部大厂,不能指望它给简历镀金,但也绝不是那种会“减分”的外包。我更愿意把它看作一个扎实的中厂跳板,适合积累实战经验。6️⃣ 怎么投递?通过数字马力gzh,今天刚放出一批新HC!如果你正在看机会,不妨试试数字马力~之前面挂过也没关系,不妨再战一次,机会说不定就来了!🤝✅ 我的专属内推码:NTA6Nvs,可以直接帮大家推进流程。📮 有任何关于公司、岗位、面试的问题,也欢迎留言,我会尽量回复~(小声说:大环境不易,希望大家都能找到心仪的工作,也欢迎来找我内推呀!)
数字马力公司福利 22人发布
点赞 评论 收藏
分享
10-30 16:31
重庆大学 Java
代码飞升_不回私信人...:你说你善于学习,大家都会说。你说你是985,985会替你表达一切
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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