python3 数独
数独
最近在网上看到数独,感觉非常有意思,所以就来实现以下。
一个数独题的网站(https://www.oubk.com/DailySudoku/17778/1),偷懒直接爬虫抓下来了,哈哈
代码实现
#!/usr/bin/python
# _*_ coding:utf-8 _*_
# Author:xiaoshubiao
# Time : 2018/9/4 10:41
import requests
from bs4 import BeautifulSoup
import math
import numpy class sudoku:
url = 'https://www.oubk.com/DailySudoku/17778/4'
one_value_list = []
def __init__(self):
self.bigtable = self.get_table()
self.sudo = self.get_table()
print('==============题目==========')
print(self.sudo)
self.current_x = 0
self.current_y = self.find_one()
self.current_v = 1
self.start()
# 通过爬虫直接获取数独的值
def get_table(self):
bigtable = numpy.zeros((9, 9))
web_data = requests.get(self.url)
soup = BeautifulSoup(web_data.text,'lxml')
tab = soup.select('table.ptb')[0]
inps = tab.select('input')
for i in range(0,len(inps)):
v = inps[i].get('value') or 0
bigtable[int(i / 9)][i % 9] = v
return bigtable
def start(self):
while self.current_x < 9:
while self.current_y < 9:
while self.current_v < 10:
if self.judge(self.current_x,self.current_y,self.current_v):
self.bigtable[self.current_x][self.current_y] = self.current_v
#每当有一个值确定之后,检查是否存现8缺一
self.current_v = 1
self.next_value()
if self.current_x == 9:
break
else:
self.current_v += 1
if self.current_x == 9:
one = self.find_one()
one_value = self.bigtable[0][one]
if one_value not in self.one_value_list:
print('==========答案============')
print(self.bigtable)
self.one_value_list.append(one_value)
self.bigtable = self.get_table()
one_value += 1
while one_value < 10:
if self.judge(0,one,one_value):
self.bigtable[0][one] = one_value + 1
self.current_x = 0
self.current_y = one + 1
self.current_v = 1
break
one_value += 1 else:
self.last_value()
if self.current_x < 0:
break
# 获取下一个值
def next_value(self):
self.current_y += 1
if self.current_y == 9:
self.current_x += 1
if self.current_x == 9:
self.current_y = 9
return
self.current_y = 0
if not self.bigtable[self.current_x][self.current_y] == 0:
self.next_value()
# 获取上一个值
def last_value(self):
# 判断当前值是否可以修改
if self.sudo[self.current_x][self.current_y] == 0:
self.bigtable[self.current_x][self.current_y] = 0
self.current_y -= 1
if self.current_y == -1:
self.current_x -= 1
self.current_y = 8
# 判断上个值是否可以修改
if self.sudo[self.current_x][self.current_y] == 0:
self.current_v = int(self.bigtable[self.current_x][self.current_y] + 1)
if self.current_v == 10:
self.last_value()
else:
self.last_value()
#检查8缺1
def check(self):
# 如果某行或者某列、某小方块有8个数确定,那么第九个数就是确定的
flag = True
while True:
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
d = 0
for i in range(0,9):
if self.bigtable[self.current_x][i] not in l:
d = i
else:
l.remove(self.bigtable[self.current_x][i])
if len(l) == 1:
if self.judge(self.current_x, d, l[0]):
# 8缺1 符合则填入该值
self.bigtable[self.current_x][d] = l[0]
else:
flag = False
break
# 检查列 =================================
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
d = 0
for i in range(0, 9):
if self.bigtable[i][self.current_y] not in l:
d = i
else:
l.remove(self.bigtable[i][self.current_y])
if len(l) == 1:
if self.judge(d,self.current_y,l[0]):
# 8缺1 符合则填入该值
self.bigtable[d][self.current_y] = l[0]
else:
flag = False
break
# 检查小方块
for x_small in range(0,3):
for y_small in range(0,3):
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
d = 0
for i in range(0, 3):
for j in range(0, 3):
if self.bigtable[i][j] not in l:
x = x_small*3 + i
y = y_small*3 + j
else:
l.remove(self.bigtable[i][j])
if len(l) == 1:
if self.judge(x, y, l[0]):
# 8缺1 符合则填入该值
self.bigtable[x][y] = l[0]
else:
flag = False
break
return flag
#判断当前值是否合适
def judge(self,x,y,v):
if v in self.bigtable[x]:
return False
for i in range(0, 9):
if v == self.bigtable[i][y]:
return False
# 检查9方块是否满足
x_small = math.floor(x / 3)
y_small = math.floor(y / 3)
for i in range(0, 3):
for j in range(0, 3):
if v == self.bigtable[i + x_small * 3][j + y_small * 3]:
return False
return True
#拿到数独第一个未知数的坐标
def find_one(self):
for i in range(0,9):
if self.sudo[0][i] == 0:
return i
s = sudoku()
整体思想:
从第一个位置开始暴力穷举,如果当前值(1-9)都不合适,就去找到当前值的上一个值+1,以此类推
千万不要用递归,会溢出的。用while循环、for循环都行。所有的递归都可以写成while(for)循环
python3 数独的更多相关文章
- python做一个数独小游戏
最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...
- python3 threading初体验
python3中thread模块已被废弃,不能在使用thread模块,为了兼容性,python3将thread命名为_thread.python3中我们可以使用threading进行代替. threa ...
- Python3中的字符串函数学习总结
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
- Mac-OSX的Python3.5虚拟环境下安装Opencv
Mac-OSX的Python3.5虚拟环境下安装Opencv 1 关键词 关键词:Mac,OSX,Python3.5,Virtualenv,Opencv 2 概述 本文是一篇 环境搭建 的基础 ...
- Ubuntu部署python3.5的开发和运行环境
Ubuntu部署python3.5的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5.1) ,之前的云主机的的默认python ...
- Python3 登陆网页并保持cookie
网页登陆 网页登陆的原理都是,保持一个sessionid在cookie然后,根据sessionid在服务端找到cookie进行用户识别 python实现 由于python的简单以及丰富的类库是开发网络 ...
- 阿里云 SDK python3支持
最近的一个项目需要操作阿里云的RDS,项目使用python3,让人惊讶的是官方的SDK竟然只支持python2 在阿里云现有SDK上改了改,文件的修改只涉及aliyun/api/base.py,详见h ...
- python3爬取1024图片
这两年python特别火,火到博客园现在也是隔三差五的出现一些python的文章.各种开源软件.各种爬虫算法纷纷开路,作为互联网行业的IT狗自然看的我也是心痒痒,于是趁着这个雾霾横行的周末瞅了两眼,作 ...
- CentOS7中安装Python3.5
1.下载 https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 2.上传到服务器 3. 安装相关依赖 yum install gcc ope ...
随机推荐
- DashBoard创建各种表(一)
创建透视表 1.首先需要创建一个DashBoard,然后点击开始导航栏中的透视,创建一个透视表,透视表可以交叉式的显示报告,让我们可以更直观的看到多维数据. 2.把CategroyName和Categ ...
- 微信小程序之点击列表的item带参数跳转界面
1.在js文件里写个界面跳转的事件处理函数gotableinfo,var index = parseInt(e.currentTarget.dataset.index); 为获取当前点击列表的下脚标, ...
- 第一次实验: CC2530平台上电源管理与休眠
实验一 CC2530平台上电源管理与休眠 实验目的: 加深和巩固学生对于TinyOS编程方法的理解和掌握 让学生初步的认识TinyOS编程的基础和简单的程序编写 学生通过本实验能够初步的了解和掌握Ti ...
- display inline or block
一.首先要了解什么是块级元素与行级元素 块级元素 会占领页面的一行,其后多个block元素自动换行. 可以设置width,height,设置了width后同样也占领一行.同样也可以设置 margi ...
- Python 汉诺塔
在汉诺塔游戏中,有三个分别命名为A.B.C得塔座,几个大小各不相同,从小到大一次编号得圆盘,每个原盘中间有一个小孔.最初,所有得圆盘都在A塔座上,其中最大得圆盘在最下面,然后是第二大,以此类推. 游戏 ...
- MySQL出现too many connections(1040)错误解决方法
https://www.cnblogs.com/2881064178dinfeng/p/6938112.html 其实MySQL默认的最大连接数为100,可能在大访问量的时候造成了连接不上数据库.解决 ...
- maya_help()验证编程过程中模块导入的情况
import rigLib reload(rigLib.base.control)spine = rigLib.base.control.Control( prefix = 'spine1') hel ...
- c#实现识别图片上的验证码数字
这篇文章主要介绍了c#实现识别图片上的验证码数字的方法,本文给大家汇总了2种方法,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...
- nginx ngx_http_image_filter_module 简单试用
nginx包含了一个ngx_http_image_filter_module 模块,我们可以方便的进行图片的缩略图,平时一些简单的功能 已经够用了 环境准备 为了简单使用docker-compose ...
- TensorFlow机器学习实战指南之第二章
一.计算图中的操作 在这个例子中,我们将结合前面所学的知识,传入一个列表到计算图中的操作,并打印返回值: 声明张量和占位符.这里,创建一个numpy数组,传入计算图操作: import tensorf ...