直接上代码

 #!/usr/bin/python3
#coding=GB2312
import tkinter as tk
import threading
import time
import random
import copy
import sys class Sudoku(threading.Thread):
winw = 500
winh = 510 def __init__(self):
threading.Thread.__init__(self)
self.ui = tk.Tk()
self.centerDisplay()
self.cells = []
self.createSudoku() self.initUi()
def checkRow(self, row, value):
if value in self.tmpCells[row]:
return False
return True
def checkCol(self, col, value):
for row in range(9):
if value == self.tmpCells[row][col]:
return False
return True
def checkBlock(self, row, col, value):
for i in range(3):
for j in range(3):
if value == self.tmpCells[int(row / 3) * 3 + i][int(col / 3) * 3 + j]:
return False
return True
def solveSudoku(self):
for i in range(9):
for j in range(9):
if 0 == self.tmpCells[i][j]:
for tmp in range(1, 10):
if(self.checkRow(i, tmp) and \
self.checkCol(j, tmp) and \
self.checkBlock(i, j, tmp)):
self.tmpCells[i][j] = tmp
if (self.solveSudoku()):
return True
else:
self.updateUi()
self.tmpCells[i][j] = self.cells[i][j]
continue
else:
continue
return False
return True def createSudoku(self):
#self.cells = [[None for i in range(9)] for i in range(9)]
self.cells = [\
[0, 0, 5, 3, 0, 0, 0, 0, 0], \
[8, 0, 0, 0, 0, 0, 0, 2, 0], \
[0, 7, 0, 0, 1, 0, 5, 0, 0], \
[4, 0, 0, 0, 0, 5, 3, 0, 0], \
[0, 1, 0, 0, 7, 0, 0, 0, 6], \
[0, 0, 3, 2, 0, 0, 0, 8, 0], \
[0, 6, 0, 5, 0, 0, 0, 0, 9], \
[0, 0, 4, 0, 0, 0, 0, 3, 0], \
[0, 0, 0, 0, 0, 9, 7, 0, 0]]
self.tmpCells = copy.deepcopy(self.cells) def initUi(self):
self.cs = tk.Canvas(self.ui, bg = '#7fb081')
self.cs.pack(fill = tk.BOTH, expand = 1)
w = self.winw / 9.0
h = self.winh / 9.0
for n in range(9):
if 0 == n % 3:
width = 4
else:
width = 1
self.cs.create_line(0, n * h, self.winw, n * h, \
width = width, fill = '#2b4490')
self.cs.create_line(n * w, 0, n * w, self.winh, \
width = width, fill = '#2b4490')
for i in range(9):
for j in range(9):
if self.cells[i][j]:
self.cs.create_text(30 + j * 55, 30 + i * 57, \
font = ('Times -55 bold'), text = self.cells[i][j])
def updateUi(self):
self.cs.delete('test')
for i in range(9):
for j in range(9):
if not self.cells[i][j] and self.tmpCells[i][j]:
self.cs.create_text(30 + j * 55, 30 + i * 57, \
font = ('Times -55 bold'), text = self.tmpCells[i][j], \
tag = 'test', fill = '#aa363d') def centerDisplay(self):
screenw = self.ui.winfo_screenwidth()
screenh = self.ui.winfo_screenheight()
self.ui.geometry('{}x{}+{}+{}'.format(\
self.winw, self.winh, int((screenw - self.winw)/2), \
int((screenh - self.winh)/2)))
self.ui.title('Sudoku by jianc') def run(self):
print(self.solveSudoku()) self.updateUi() sys.setrecursionlimit(100000)
sudoku = Sudoku()
sudoku.start()
tk.mainloop()

百度上有个最难数独, 用python跑它的更多相关文章

  1. swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~

    title: swoft| 源码解读系列一: 好难! swoft demo 都跑不起来怎么破? docker 了解一下呗~description: 阅读 sowft 框架源码, swoft 第一步, ...

  2. ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库

    ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库. 与现有的主要针对监督任务设计的深度学习库不同,ZhuSuan 的特点是深入到贝叶斯推理中,从而支持各种生成模式:传 ...

  3. Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建;学习Python语言,利用Python语言来写测试用例。加油!!!

    Python+selenium测试环境成功搭建,简单控制浏览器(firefox)接下来,继续学习其他浏览器上的测试环境搭建:学习Python语言,利用Python语言来写测试用例.加油!!!

  4. 史上最详细的C语言和Python的插入排序算法

    史上最详细的C语言和Python的插入排序算法插入排序原理:所谓插入排序,就像我们在打牌(斗地主)时,整理我们自己手中自己的牌一样,就像是2,1,3,9,J,K,5,4,这四张牌.我们要把它其中的几张 ...

  5. 在Ubuntu 18.04上安装OpenCV 4(C ++和Python)

    OpenCV于11月20日发布了OpenCV-3.4.4和OpenCV-4.0.0.这些版本中有很多错误修复和其他更改.发布重点如下: OpenCV现在是C ++ 11库,需要符合C ++ 11标准的 ...

  6. 百度上传插件WebUploader,angularjs指令封装

    1.WebUploader特点 官网地址:http://fex.baidu.com/webuploader/ 1.1 分片.并发 分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上 ...

  7. 百度上传插件---webuploader的使用

    需求:朋友让找一个兼容IE8的上传插件,卧槽,IE8,我当时是崩溃的,然后就搜到了这个百度的插件,官网是这样描述的 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HT ...

  8. [转载] 百度上传&下载脚本

    下载百度网盘中的文件,最简单的办法是使用wget命令.找到百度网盘文件,点击下载,然后找到相应的下载地址,复制链接地址即可.但这种方法有一个bug,因为百度云网盘访问文件的链接地址是动态的,当文件比较 ...

  9. 百度上传工具webuploader,图片上传附加参数

    项目中需要上传视频,图片等资源.最先做的是上传图片,开始在网上找了一款野鸡插件,可以实现图片上传预览(无需传到后台).但是最近这个插件出了莫名的问题,不易修复,一怒之下,还是决定找个大点的,靠谱的插件 ...

随机推荐

  1. ubuntu snap 包管理器

    基本使用 snap find $package snap install $package [--channel=beta] snap list snap refresh $package [--ch ...

  2. DOM选择器

    DOM选择器分为:id.class.name.tagname.高级.关系选择器;(返回的都是标签) 一:元素节点选择器: 1. id: 返回的是单个对象 <body> <div cl ...

  3. SSD如何设置预留空间OP(Over-Provision)

    Over-Provision操作指南 SSD OP全称是(Over-Provision), 中文名预留空间, 指用户不可操作的容量,大小为SSD实际容量减去用户可用容量.简单来说over-provis ...

  4. FileInputStream_FileOutputStream

    Writer的基本方法 //向输出流中写入一个字符数据,该字节数据为参数b的低16位 void write(int c) throws IOException //将一个字符类型的数组中的数据写入输出 ...

  5. git 更新代码

    https://jingyan.baidu.com/album/ab69b2707882f52ca7189f14.html?picindex=7 git commit:将本地修改过的文件提交到本地库 ...

  6. ES6几大特性,让你的代码更优美

    1.Default Parameters(默认参数) in ES6 还记得我们以前不得不通过下面方式来定义默认参数:   var link = function (height, color, url ...

  7. C#log4net的使用

    一,下载log4net.dll,在项目中添加引用 二,在站点根目录添加,配置文件(log4net.xml), <file value="logs/logfile.txt"/& ...

  8. ReactOS 无法显示中文的问题

    其实非常简单, 实际上是因为包里面没有中文字体,所以输出文字都是乱码, 去 https://svn.reactos.org/optional/ 这里,下载ttf字体文件, 把字体文件放到源码中 mod ...

  9. Vue.js 3 Step 创建一个组件

    Step1:Vue.extend()创建组件 Step2:Vue.component()注册组件,注册的标签一定要用小写 Step3:挂载点使用组件 <!doctype html> < ...

  10. Java模拟HttpClient进行Get和Post提交

    使用Java模拟客户端进行提交,需要用到apache http client jar,这里用的是4.4版本 GET: public void GetURL(){  String strResp=&qu ...