python3.6数独问题的解决


Posted in Python onJanuary 21, 2019

算法比较暴力,直接用穷举的方式一个一个去试,所以程序运行时间会比较长,运行时间视数独而定。
不过从一开始到运行成功,整个过程却是一波三折,设计算法就花了不少时间,然后就是不断地去调试,找bug。刚开始的时候为了省事直接在sudoku类中递归调用blank,但是老哥还是too young too simple,sometimes navie,计算量实在是太大了,后面编译器直接抛出 “RecursionError: maximum recursion depth exceeded while calling a Python object” 超过最大递归深度的错误。在把递归深度改到100000之后,又出现了堆栈溢出问题。当然,解决办法也是相当地暴力:把递归放入while循环中,一旦符合条件就直接exit(0),整个程序直接gg,然后退出结束。
当然,算法还可以再优化一下,可以不用那么暴力,先列出可能的值然后再填入,这样可以大大缩小整个程序的运行时间,但是……懒得优化了,就这样吧,又不是不能用(笑~)。

运行结果:

python3.6数独问题的解决

再试一个其他的数独:

python3.6数独问题的解决

这回就快得多了,11秒就完成了,比第一个数独不知高到哪里去了

代码如下所示:

import copy
import time

t1=time.time()
origin = [[8, 0, 0, 0, 0, 0, 0, 0, 0],
  [0, 0, 3, 6, 0, 0, 0, 0, 0],
  [0, 7, 0, 0, 9, 0, 2, 0, 0],
  [0, 5, 0, 0, 0, 7, 0, 0, 0],
  [0, 0, 0, 0, 4, 5, 7, 0, 0],
  [0, 0, 0, 1, 0, 0, 0, 3, 0],
  [0, 0, 1, 0, 0, 0, 0, 6, 8],
  [0, 0, 8, 5, 0, 0, 0, 1, 0],
  [0, 9, 0, 0, 0, 0, 4, 0, 0]]

class sudoku:
 def debug(self): # 调试
 for list in origin:
  print(list)
 print("\n")

 def check_repetition(self,list):#判断表中是否有重复值,0除外
 flag=0
 for i in range(1,10):
  if list.count(i)>=2:
  return 1
  else:
  flag=flag+1
 if flag==9:
  return 0

 def check_row(self,row):#检测横向是否有重复值,无则为返回0,有则返回1
 list = origin[row] # 横向
 r1 = self.check_repetition(list)
 if r1 == 0:
  return 0
 else :
  return 1

 def check_column(self,column):#检测纵向是否重复值,无则为返回0,有则返回1
 list = [] # 纵向
 for num in origin:
  list.append(num[column])
 r2 = self.check_repetition(list)
 if r2==0:
  return 0
 else:
  return 1

 def check_square(self,x,y):#检测九宫格是否有重复值,无则为返回0,有则返回1
 x,y=y,x
 if x>=9 or y>=9:
  return
 square = []#九宫格
 for i in range(0+y//3*3, 3+y//3*3):
  for j in range(0+x//3*3, 3+x//3*3):
  square.append(origin[i][j])
 r3 = self.check_repetition(square)
 if r3==0:
  return 0
 else:
  return 1

 def check(self,x,y):#检测是否有重复值,无则为0,有则不为0
 r1 = self.check_row(x)
 r2 = self.check_column(y)
 r3 = self.check_square(x, y)
 result=r1+r2+r3
 return result

 def get_next(self): # 获得下一个空值,返回row,column值
 i = 0
 for list in origin:
  try: # 当0不在列表中时,跳过
  column = list.index(0)
  row = origin.index(list)
  res = (row, column)
  return res
  except ValueError:
  i = i + 1
  if i == 9:
   t2=time.time()
   print("总用时={}".format(t2 - t1))
   exit(0)

 def poi(self,row, column): # 位置修正
 if row == 0 and column == -1:
  return
 if row == 8 and column == 9:
  return
 if column == -1:
  column = 8
  row = row - 1
 if column == 9:
  column = 0
  row = row - 1
 return (row, column)

 def get_last(self,row, column):
 origin[row].insert(column, 0)
 origin[row].pop(column + 1)
 column = column - 1 # 获得上一个已填值的行、列位置
 row, column = self.poi(row, column)#位置修正
 r = origin[row][column] * compare[row][column]
 while r != 0:
  column = column - 1
  row, column = self.poi(row, column)
  r = origin[row][column] * compare[row][column]
 return (row, column)

 def blank(self):
 try:
  row,column=self.get_next()
 except TypeError:#已填完
  exit(0)
 j=0
 flag=0
 for i in range(1,10):
  origin[row].insert(column,i)
  origin[row].pop(column+1)
  self.debug()
  r = self.check(row, column)
  if r==0:#无重复值
  return
  else:
  j = j + 1
  if j==9:
   flag=1
   break
 if flag==1:
  row, column = self.get_last(row, column)
  value=origin[row][column]
  self.debug()
  while value == 9:
  row, column = self.get_last(row, column)
  value = origin[row][column]
  self.debug()
  while value<9:
  for k in range(value+1,10):
   origin[row].insert(column, k)
   origin[row].pop(column + 1)
   self.debug()
   r=self.check(row,column)
   if r!=0:#有重复
   if k==9:
    row, column = self.get_last(row, column)
    value=origin[row][column]
    self.debug()
    while value==9:
    row, column = self.get_last(row, column)
    value = origin[row][column]
    self.debug()
    break
   else:
   return

if __name__=="__main__":
 compare = copy.deepcopy(origin)
 sudoku = sudoku()
 while 1:
 sudoku.blank()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 中urls.py:URL dispatcher(路由配置文件)详解
Mar 24 Python
Python之re操作方法(详解)
Jun 14 Python
python处理Excel xlrd的简单使用
Sep 12 Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
python如何制作缩略图
Apr 30 Python
Django 表单模型选择框如何使用分组
May 16 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
Tensorflow实现在训练好的模型上进行测试
Jan 20 Python
Python实现名片管理系统
Feb 14 Python
Python matplotlib图例放在外侧保存时显示不完整问题解决
Jul 28 Python
解决python给列表里添加字典时被最后一个覆盖的问题
Jan 21 #Python
对python列表里的字典元素去重方法详解
Jan 21 #Python
在Python中字典根据多项规则排序的方法
Jan 21 #Python
详解opencv Python特征检测及K-最近邻匹配
Jan 21 #Python
pycharm远程开发项目的实现步骤
Jan 20 #Python
对python中类的继承与方法重写介绍
Jan 20 #Python
python 格式化输出百分号的方法
Jan 20 #Python
You might like
PHP 变量类型的强制转换
2009/10/23 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
Eclipse引入jquery报错如何解决
2015/12/01 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
react native 获取地理位置的方法示例
2018/08/28 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
Python常见文件操作的函数示例代码
2011/11/15 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python读取stdin方法实例
2019/05/24 Python
python向字符串中添加元素的实例方法
2019/06/28 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
css3新增颜色表示方式分享
2014/04/15 HTML / CSS
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
HR必备:超全面的薪酬待遇管理方案!
2019/07/12 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
Python 用户输入和while循环的操作
2021/05/23 Python
Django实现WebSocket在线聊天室功能(channels库)
2021/09/25 Python
微信小程序APP的事件绑定以及传递参数时的冒泡和捕获
2022/04/19 Javascript