这是对上一篇的一个补充(Python来处理数独游戏(含世界最难数独示例)),看起来更加简单,思路都是一样的,在填入数字的时候需要判断行、列、每个小九宫格都不能有这个即将填入的数,这样一直填写,如果发现1~9的数字都填完了还是不对,这个时候就需要回溯,将上一步填入的重新置为空位置,这样来来回回的折腾即可

另外加入一个次数和时间,也就是方便查看求这个数独难易程度!

import timeclass Sudoku(object) :def __init__(self,sudo_ku_data):self.sudoku = sudo_ku_dataself.nums = 0 #计算需要多少次def check(self,x,y,value):for i in range(0,9):if value == self.sudoku[x][i]:#行不能有即将填入的value值return Falsefor j in range(0,9):if value == self.sudoku[j][y]:#列不能有即将填入的value值return Falserow_num = (x // 3) * 3 #0,3,6col_num = (y // 3) * 3 #0,3,6#每个小九宫格(3行+3列)的单元格不能有即将填入的value值block = self.sudoku[row_num][col_num:col_num + 3] + self.sudoku[row_num + 1][col_num:col_num + 3] + self.sudoku[row_num + 2][col_num:col_num + 3]for k in block:if value == k :return Falsereturn Truedef next_one(self,x,y):#下一个空位置,如果没有就说明已填满for next_y1 in range(y+1,9):if self.sudoku[x][next_y1] == '':return x,next_y1for next_x in range(x+1,9):for next_y2 in range(0,9):if self.sudoku[next_x][next_y2] == '':return next_x,next_y2return -1,-1def fill_num(self,x,y):'''填数思路:填入空位置的数,先进行判断,符合就填入,再寻找下一个空位置如果下一个空位置填入的数不合理,需要进行回溯,上一步重新置为空位置'''if self.sudoku[x][y] == '':for v in range(1,10):self.nums+=1if self.check(x,y,v):self.sudoku[x][y] = vnext_x,next_y = self.next_one(x,y)if next_x == -1:return Trueelse:end = self.fill_num(next_x,next_y)if not end :self.sudoku[x][y] = ''else:return Truedef get_result(self):begin = time.perf_counter()if self.sudoku[0][0] == '':self.fill_num(0,0)else:x,y = self.next_one(0,0)self.fill_num(x,y)for i in self.sudoku:print(i)end = time.perf_counter()print('\n需计算{}次,花费{}秒'.format(self.nums,end-begin))sudo_ku_data4 = [[8,'','', '', '', '', '', '', ''],['', '', 3, 6, '', '', '', '', ''],['', 7, '', '', 9, '', 2, '', ''],['', 5, '', '', '', 7, '', '', ''],['', '', '', '', 4, 5, 7, '', ''],['', '', '', 1, '', '', '', 3, ''],['', '', 1, '', '', '', '', 6, 8],['', '', 8, 5, '', '', '', 1, ''],['', 9, '', '', '', '', 4, '', ''],]
Sudoku(sudo_ku_data4).get_result()
[8, 1, 2, 7, 5, 3, 6, 4, 9]
[9, 4, 3, 6, 8, 2, 1, 7, 5]
[6, 7, 5, 4, 9, 1, 2, 8, 3]
[1, 5, 4, 2, 3, 7, 8, 9, 6]
[3, 6, 9, 8, 4, 5, 7, 2, 1]
[2, 8, 7, 1, 6, 9, 5, 3, 4]
[5, 2, 1, 9, 7, 4, 3, 6, 8]
[4, 3, 8, 5, 2, 6, 9, 1, 7]
[7, 9, 6, 3, 1, 8, 4, 5, 2]需计算445778次,花费0.8271723999999998秒

Python求数独的补充相关推荐

  1. python求数独全解

    数独可能不止一个解,本程序试图找出全部的解,测试发现所谓的最难数独运行时间明显非常长 所谓最难的就是第一个范例,得出唯一解倒是不满,只是程序要遍历全部可能性,导致耗费时间冗长. 范例二是多解数独 范例 ...

  2. delphi dbgrideh 遍历每一个单元格_用Python解数独[1]:求每个单元格的行值域

    目录 用Python解数独[0] 用Python解数独[1]:求每个单元格的行值域 用Python解数独[2]:求列值域和九宫格值域 用Python解数独[3]:求总值域 用Python解数独[4]: ...

  3. python递归求5!_用Python解数独[6]:递归获得最终答案

    import copy import time # 求每一行单元格行值域 def valueRange(row): temp = copy.deepcopy(row) row_value_range ...

  4. python deepcopy函数_用Python解数独[6]:递归获得最终答案

    目录 用Python解数独[0] 用Python解数独[1]:求每个单元格的行值域 用Python解数独[2]:求列值域和九宫格值域 用Python解数独[3]:求总值域 用Python解数独[4]: ...

  5. 【Numpy】用Python求解数独

    目录 [题目]列出如下数独问题的2种数学模型,分析两种模型的优缺点,并用Excel求解,将结果填上.这里用Python进行求解: 一.代码 model1 二.代码 model2 三.求解结果 [题目] ...

  6. python中求最小公约数,python求最大公约数和最小公倍数的简单方法

    python求最大公约数和最小公倍数的简单方法 python怎么求最大公约数和最小公倍数 一.求最大公约数 用辗转相除法求最大公约数的算法如下: 两个正整数a和b(a>b),它们的最大公约数等于 ...

  7. python求不同分辨率图像的峰值信噪比,一文搞懂

    可以使用 Python 的 NumPy 和 OpenCV 库来实现这个任务.提前准备一张图片作为素材. 文章目录 什么是峰值信噪比 PSNR 峰值信噪比补充说明 使用 OpenCV 库来实现这个任务 ...

  8. python求最小值函数_python取最小值

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我使用浮点值作为字典键. 偶尔,非常偶尔(也许永远不会,但不一定永远不会),会有 ...

  9. python求10以内的素数_python如何求100以内的素数

    方法一,用for循环来实现 num=[]; i=2 for i in range(2,100): j=2 for j in range(2,i): if(i%j==0): break else: nu ...

最新文章

  1. 浅析IPDCC的地理信息识别和服务
  2. [导入]《交互设计之路——让高科技产品回归人性》读书笔记(一)
  3. asp打开exe执行本地程序._基于QT应用程序打包成可执行程序exe
  4. mac 黑窗口连接mysql_Mac系统Python、PyCharm安装及使用方法详解
  5. 寻找百度翻译参数,实现百度翻译
  6. kindle可以设置24小时吗_华为怎么设置时间24小时
  7. qt构建json字符串的时候,某一个值为字符串
  8. 面试必备|ID3、C4.5、CART、RF、boosting、Adaboost、GBDT、xgboost模型
  9. eric python mysql,python入门教程13-07 (python语法入门之ORM框架SQLAlchemy)
  10. 【Flink】Flink network netty ProducerFailedException SimpleChannelInboundHandler NullPointerException
  11. 原生 遍历_迭代器模式统一集合的遍历方式
  12. 使用FFTW3做二维DFT的示例代码
  13. java 使用Sql数据库代码
  14. 多线程(三)--多线程间通信
  15. (转载)web.xml中 IntrospectorCleanupListener的作用
  16. Android开发之桌面快捷键使用细则(原创)
  17. 大内老A:200行代码,7个对象——让你了解ASP.NET Core框架的本质
  18. windows系统各进程详解
  19. Poc/Exp漏洞验证利用脚本编写
  20. VBA用字典实现分类汇总(一)

热门文章

  1. cannot load such file -- readline
  2. 现代软件工程—构建之法---第三章:练习与讨论
  3. [区块链] 拜占庭将军问题 [BFT]
  4. Windows 7 添加SSD硬盘后重启卡住正在启动
  5. HDLM命令dlnkmgr详解之二__help/clear
  6. MySql数据类型分析(银行家舍入法) Part3
  7. 人工智能——数据、信息与知识
  8. vc++ cfile 文件操作
  9. centos7查看安装的是64位系统还是32位系统---linux工作笔记043
  10. System学习笔记002---Windows下输入日文,あ会变成ち