鱼C论坛

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

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

[复制链接]
发表于 2020-8-30 15:09:29 | 显示全部楼层 |阅读模式
4鱼币
看到论坛里有人做了数独求解器,本来也想做一个,但是出了一点问题:(求分析或思路,不用帮我改代码)

  1. # sudoku here
  2. # 原题
  3. line1 = [0, 0, 8, 0, 0, 0, 2, 0, 0]
  4. line2 = [0, 3, 0, 8, 0, 2, 0, 6, 0]
  5. line3 = [7, 0, 0, 0, 9, 0, 0, 0, 5]
  6. line4 = [0, 5, 0, 0, 0, 0, 0, 1, 0]
  7. line5 = [0, 0, 4, 0, 0, 0, 6, 0, 0]
  8. line6 = [0, 2, 0, 0, 0, 0, 0, 7, 0]
  9. line7 = [4, 0, 0, 0, 8, 0, 0, 0, 6]
  10. line8 = [0, 7, 0, 1, 0, 3, 0, 9, 0]
  11. line9 = [0, 0, 1, 0, 0, 0, 8, 0, 0]

  12. # solution here

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

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

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

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

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

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

  41.         numbers = set(range(1, 10))

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

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

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

  51.         else:
  52.                 return

  53. temp = 0

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

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

  60.         if temp >= 100:
  61.                 break

  62. # 100 steps here
  63. # while循环一百次结果
  64. [9, 4, 8, 0, 0, 0, 2, 5, 0]
  65. [0, 3, 5, 8, 0, 2, 0, 6, 0]
  66. [7, 1, 6, 2, 9, 0, 0, 4, 5]
  67. [0, 5, 0, 0, 6, 7, 0, 1, 9]
  68. [1, 8, 4, 0, 7, 9, 6, 3, 0]
  69. [3, 2, 0, 0, 0, 6, 9, 7, 0]
  70. [4, 9, 0, 0, 8, 5, 3, 2, 6]
  71. [0, 7, 2, 1, 0, 3, 5, 9, 8]
  72. [5, 6, 1, 0, 0, 0, 8, 0, 3]

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


谢谢!

最佳答案

查看完整内容

https://fishc.com.cn/forum.php?mod=viewthread&tid=74816
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 15:09:30 | 显示全部楼层    本楼为最佳答案   
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

啊!没人!!!
@Twilight6
求大神解答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 16:11:45 | 显示全部楼层
这个太高深了,论坛里都是初学者,完全没思路,只有请版主来解惑了
这个帖子起码设个100++鱼币,4个太少了
小甲鱼最新课程 -> https://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
看回复……
小甲鱼最新课程 -> https://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
看回复… ...

看了一脸懵_.......
求解答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

呃,我也发了求助帖,等别人解答吧……
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

哦~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-26 11:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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