资讯专栏INFORMATION COLUMN

8个步骤教你用Python解数独!(内含源码)

cikenerd / 3786人阅读

摘要:数独的规则为每个谜题都由一个在不同位置给与提示数字的网格组成。游戏的目的是将空方格填上数字,使得每一行,每一列以及每一个宫都没有重复的数字出现。

前言

利用Python来解数独~~~
起因大概是:
自己解数独实在是太费劲了!!!

代码效果展示

所需工具

python版本: 3.5.4

主要思路

思路很简单:

将每个空格可能填入的数先列举出来,然后就是深搜来解数独。

数独的规则为:

每个谜题都由一个在不同位置给与提示数字的9x9网格组成。游戏的目的是将空方格填上数字,使得每一行,每一列以及每一个3x3宫都没有重复的数字出现。

代码实现

# 点类class point():	def __init__(self, x, y):		self.x = x		self.y = y		self.available = []		self.value = 0# 该空格所在行有哪些数def rowNum(p ,sudoku):	# set用于去重,因为0不止一个!	row = set(sudoku[p.y*9: (p.y+1)*9])	row.remove(0)	return row# 该空格所在列有哪些数def colNum(p, sudoku):	col = []	length = len(sudoku)	for j in range(p.x, length, 9):		col.append(sudoku[j])	col = set(col)	col.remove(0)	return col# 该空格所在小九宫有哪些数def blockNum(p, sudoku):	block_x = p.x//3	block_y = p.y//3	block = []	start_point = block_y*3*9 + block_x*3	for j in range(start_point, start_point+3):		block.append(sudoku[j])	for j in range(start_point+9, start_point+9+3):		block.append(sudoku[j])	for j in range(start_point+9+9, start_point+9+9+3):		block.append(sudoku[j])	block = set(block)	block.remove(0)	return block# 初始化,作用为:# 把每个空格可能的点先列举出来# 比如空格所在的行和列还有小九宫内有数字1、2、3# 那么空格只能填入4、5、6、7、8、9中的某个数def initialize(sudoku):	sudokuList = []	length = len(sudoku)	for index in range(length):		# 找到需要填入的单元,即空格		if sudoku[index] == 0:			p = point(index%9, index//9)			for i in range(1, 10):				# 如果行、列、小九宫中均没有i这个数				if (i not in rowNum(p, sudoku)) and (i not in colNum(p, sudoku)) and (i not in blockNum(p, sudoku)):					p.available.append(i)			sudokuList.append(p)	return sudokuList# 检验该数填入空格后是否满足数独规则def check(p, sudoku):	if p.value == 0:		return False	if (p.value not in rowNum(p, sudoku)) and (p.value not in colNum(p, sudoku)) and (p.value not in blockNum(p, sudoku)):		return True	else:		return False# 展示数独结果def showResult(sudoku):	for r in range(9):		for c in range(9):			print("%d " % (sudoku[r*9+c]), end="")		print("")# 深搜来解数独def solve(p, sudoku):	available_Num = p.available	for ava in available_Num:		p.value = ava		if check(p, sudoku):			sudoku[p.y*9+p.x] = p.value			if len(sudokuList) < 1:				showResult(sudoku)				exit()			p_next = sudokuList.pop()			solve(p_next, sudoku)			sudoku[p_next.y*9+p_next.x] = 0			sudoku[p.y*9+p.x] = 0			p_next.value = 0			sudokuList.append(p_next)		else:			passif __name__ == "__main__":	# 0代表需要填入的单元,即空格	sudoku = [				0, 0, 0, 0, 0, 0, 0, 0, 0,				0, 9, 3, 6, 2, 8, 1, 4, 0,				0, 6, 0, 0, 0, 0, 0, 5, 0,  				0, 3, 0, 0, 1, 0, 0, 9, 0,  				0, 5, 0, 8, 0, 2, 0, 7, 0,  				0, 4, 0, 0, 7, 0, 0, 6, 0,  				0, 8, 0, 0, 0, 0, 0, 3, 0,  				0, 1, 7, 5, 9, 3, 4, 2, 0,  				0, 0, 0, 0, 0, 0, 0, 0, 0, 			]	sudokuList = initialize(sudoku)	print("数独题目为:/n")	showResult(sudoku)	print("/n数独的解为:/n")	p_first = sudokuList.pop()	solve(p_first, sudoku)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119756.html

相关文章

  • 求解(javascript实现)

    摘要:数独技巧直观法候选数法相关二十格一个数字只与其所在行列及小九宫格的二十格相关我的思路精心设计了有效性判定函数,最多一次遍历个小单元格就能做出方案的有效性判定。 看《算法的乐趣》,试着用非递归穷举来解数独,看效率如何! 数独规则 数独游戏,经典的为9×9=81个单元格组成的九宫格,同时也形成了3×3=9个小九宫格,要求在81个小单元格中填入数字1~9,并且数字在每行每列及每个小九宫格中都...

    Berwin 评论0 收藏0
  • 手把手你用python制作属于你的第一词云

    摘要:利用强大的语言制作属于自己的第一张词云。还有一件很有意思的事情,和的中文意思,都是蟒蛇。好,接下来进入正题,一步一步实现我们的第一张词云。但是我们如果要对中文进行分析,还必须要借助中文分词技术。 相信很多人在网上,或者是在一些报告或者ppt上,都看到过类似这种图片 showImg(https://segmentfault.com/img/bVQRr0?w=1920&h=919); 你可...

    happyfish 评论0 收藏0
  • 前端每日实战:164# 视频演示如何用原生 JS 创作一训练小游戏(内含 4 视频)

    摘要:第部分第部分第部分第部分源代码下载每日前端实战系列的全部源代码请从下载代码解读解数独的一项基本功是能迅速判断一行一列或一个九宫格中缺少哪几个数字,本项目就是一个训练判断九宫格中缺少哪个数字的小游戏。 showImg(https://segmentfault.com/img/bVbkNGa?w=400&h=300); 效果预览 按下右侧的点击预览按钮可以在当前页面预览,点击链接可以全屏预...

    Heier 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<