数独

  最近在网上看到数独,感觉非常有意思,所以就来实现以下。

一个数独题的网站(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 数独的更多相关文章

  1. python做一个数独小游戏

    最近看了下python的一些知识,在这里记载一下. 1.首先是安装,在官网下载最新的版本3.6,安装的时候要注意在下面勾选上ADD TO PATH,安装的时候会自动写入到环境变量里面,如果没有勾选,可 ...

  2. python3  threading初体验

    python3中thread模块已被废弃,不能在使用thread模块,为了兼容性,python3将thread命名为_thread.python3中我们可以使用threading进行代替. threa ...

  3. Python3中的字符串函数学习总结

    这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...

  4. Mac-OSX的Python3.5虚拟环境下安装Opencv

    Mac-OSX的Python3.5虚拟环境下安装Opencv 1   关键词 关键词:Mac,OSX,Python3.5,Virtualenv,Opencv 2   概述 本文是一篇 环境搭建 的基础 ...

  5. Ubuntu部署python3.5的开发和运行环境

    Ubuntu部署python3.5的开发和运行环境 1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5.1) ,之前的云主机的的默认python ...

  6. Python3 登陆网页并保持cookie

    网页登陆 网页登陆的原理都是,保持一个sessionid在cookie然后,根据sessionid在服务端找到cookie进行用户识别 python实现 由于python的简单以及丰富的类库是开发网络 ...

  7. 阿里云 SDK python3支持

    最近的一个项目需要操作阿里云的RDS,项目使用python3,让人惊讶的是官方的SDK竟然只支持python2 在阿里云现有SDK上改了改,文件的修改只涉及aliyun/api/base.py,详见h ...

  8. python3爬取1024图片

    这两年python特别火,火到博客园现在也是隔三差五的出现一些python的文章.各种开源软件.各种爬虫算法纷纷开路,作为互联网行业的IT狗自然看的我也是心痒痒,于是趁着这个雾霾横行的周末瞅了两眼,作 ...

  9. CentOS7中安装Python3.5

    1.下载 https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz 2.上传到服务器 3. 安装相关依赖 yum install gcc ope ...

随机推荐

  1. python rabbitMQ 发送端和接收端广播模式。

    消费者模型: import pika,time consumer = pika.BlockingConnection\ (pika.ConnectionParameters('localhost')) ...

  2. js原型链的深度理解!

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function 是 JS 自带的函数对象.下面举例说明 var o1 = ...

  3. POJ3208 Apocalypse Someday

    题意 Language:Default Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 2 ...

  4. CF559C Gerald and Giant Chess

    题意 C. Gerald and Giant Chess time limit per test 2 seconds memory limit per test 256 megabytes input ...

  5. iTrash for Mac(卸载工具)破解版含注册机

    iTrash for Mac是一款专为Mac用户打造非常好用的卸载工具,itrash mac版简单好用,只需要把需要卸载的程序的拖拽到iTrash Mac版窗口内就可以删除应用程序.现为大家带来itr ...

  6. idea 启动项目提示 Command line is too long. Shorten command line for Application or also for Spring Boot default configuration.

    在.idea 文件夹中打开workspace.xml文件找到<component name="PropertiesComponent">,在标签里加一行  <pr ...

  7. mysql异常 : The driver has not received any packets from the server.

    异常: 结论:域名写错了或报这个异常

  8. 1.搭建Angular2项目

    简述:搭建angular2的开发环境,网上已经有许多教程,不过都是window系统下的教程,我本人使用的是linux系统,搭建环境的过程也稍微比前者麻烦了一点,可参考本人的另一篇文章Linux系统下安 ...

  9. docker 限制container容器使用内存大小,不限制swap

    docker update --memory 20g --memory-swap -1 96b14c546d98 参考:https://my.oschina.net/Kanonpy/blog/2209 ...

  10. C# .net mvc web api 返回 json 内容,过滤值为null的属性

    在WebApiConfig.Register 中增加一段 #region 过滤值为null的属性 //json 序列化设置 GlobalConfiguration.Configuration.Form ...