鱼C论坛

 找回密码
 立即注册
查看: 1724|回复: 7

[已解决]数独求解器问题

[复制链接]
发表于 2020-8-30 15:09:29 | 显示全部楼层 |阅读模式
4鱼币
看到论坛里有人做了数独求解器,本来也想做一个,但是出了一点问题:(求分析或思路,不用帮我改代码)
# sudoku here
# 原题
line1 = [0, 0, 8, 0, 0, 0, 2, 0, 0]
line2 = [0, 3, 0, 8, 0, 2, 0, 6, 0]
line3 = [7, 0, 0, 0, 9, 0, 0, 0, 5]
line4 = [0, 5, 0, 0, 0, 0, 0, 1, 0]
line5 = [0, 0, 4, 0, 0, 0, 6, 0, 0]
line6 = [0, 2, 0, 0, 0, 0, 0, 7, 0]
line7 = [4, 0, 0, 0, 8, 0, 0, 0, 6]
line8 = [0, 7, 0, 1, 0, 3, 0, 9, 0]
line9 = [0, 0, 1, 0, 0, 0, 8, 0, 0]

# solution here

def which_block(where):  # 获取这个数所在的宫有哪些数
        line = where[1] + 1
        exec(f'row = {where[0] + 1}', globals())

        if line < 4 and row < 4:
                return set(line1[:4] + line2[:4] + line3[:4])
        elif 7 > line > 3 and row < 4:
                return set(line4[:4] + line5[:4] + line6[:4])
        elif line > 6 and row < 4:
                return set(line7[:4] + line8[:4] + line9[:4])

        if line < 4 and 3 < row < 7:
                return set(line1[:4] + line2[:4] + line3[:4])
        elif 7 > line > 3 and 3 < row < 7:
                return set(line4[:4] + line5[:4] + line6[:4])
        elif line > 6 and 3 < row < 7:
                return set(line7[:4] + line8[:4] + line9[:4])

        if line < 4 and 6 < row:
                return set(line1[:4] + line2[:4] + line3[:4])
        elif 7 > line > 3 and 6 < row:
                return set(line4[:4] + line5[:4] + line6[:4])
        elif line > 6 and 6 < row:
                return set(line7[:4] + line8[:4] + line9[:4])

def solve_one(where):  # 求解一个数
        exec(f'number = line{where[1] + 1}[{where[0]}]', globals()) # 求这个数是什么
        exec(f'line = line{where[1] + 1}', globals())
        exec(f'row = {where[0]}', globals())

        row_numbers = []
        for i in range(9):
                exec(f'row_numbers.append(line{i + 1}[row])')  # 一列都有什么数

        numbers = set(range(1, 10))

        if number == 0:  # 只有这个数未知才判断
                numbers = numbers - set(line)  # 一行去除相同数
                numbers = numbers - set(row_numbers)  # 一列去除相同数
                numbers = numbers - which_block(where)  # 一宫去除相同数

                if len(numbers) == 1:  # 如果有唯一数就返回它
                        exec(f'line{where[1] + 1}[{where[0]}] = list(numbers)[0]')  # 更新数独
                        return list(numbers)[0]

                else:
                        return  # 求不出就退出等待下次

        else:
                return

temp = 0

while 0 in line1 + line2 + line3 + line4 + line5 + line6 + line7 + line8 + line9: # 如果还有零就继续循环
        for ii in range(9):
                for jj in range(9):
                        result = solve_one((ii, jj))

        print(line1, line2, line3, line4, line5, line6, line7, line8, line9, '\n', sep='\n')
        temp += 1  # 控制循环次数

        if temp >= 100:
                break

# 100 steps here
# while循环一百次结果
[9, 4, 8, 0, 0, 0, 2, 5, 0]
[0, 3, 5, 8, 0, 2, 0, 6, 0]
[7, 1, 6, 2, 9, 0, 0, 4, 5]
[0, 5, 0, 0, 6, 7, 0, 1, 9]
[1, 8, 4, 0, 7, 9, 6, 3, 0]
[3, 2, 0, 0, 0, 6, 9, 7, 0]
[4, 9, 0, 0, 8, 5, 3, 2, 6]
[0, 7, 2, 1, 0, 3, 5, 9, 8]
[5, 6, 1, 0, 0, 0, 8, 0, 3]

# question
# 执行到20次左右时结果就不会再变了
# 手工做了一下, 发现答案不符
# 速度每次循环(1 step)耗时0.0149秒

谢谢!

最佳答案

查看完整内容

https://fishc.com.cn/forum.php?mod=viewthread&tid=74816
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 15:09:30 | 显示全部楼层    本楼为最佳答案   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-30 15:47:46 | 显示全部楼层
本帖最后由 lijiachen 于 2020-8-30 15:48 编辑

啊!没人!!!
@Twilight6
求大神解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 16:11:45 | 显示全部楼层
这个太高深了,论坛里都是初学者,完全没思路,只有请版主来解惑了
这个帖子起码设个100++鱼币,4个太少了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-30 16:16:10 | 显示全部楼层
疾风怪盗 发表于 2020-8-30 16:11
这个太高深了,论坛里都是初学者,完全没思路,只有请版主来解惑了
这个帖子起码设个100++鱼币,4个太少了

高深……
https://fishc.com.cn/forum.php?m ... hlight=%BB%D8%CB%DD
看回复……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 16:20:43 | 显示全部楼层
lijiachen 发表于 2020-8-30 16:16
高深……
https://fishc.com.cn/forum.php?mod=viewthread&tid=82257&highlight=%BB%D8%CB%DD
看回复… ...

看了一脸懵_.......
求解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-30 16:24:41 | 显示全部楼层
疾风怪盗 发表于 2020-8-30 16:20
看了一脸懵_.......
求解答

呃,我也发了求助帖,等别人解答吧……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-30 21:06:02 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-30 17:53
https://fishc.com.cn/forum.php?mod=viewthread&tid=74816

哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-19 03:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表