总结:数独的规则是每个谜题都由一个网格组成,网格的不同位置有提示数字。 游戏的目标是用数字填充空的方格,以便每行、每列或宫殿中不会出现重复的数字。
简介
用Python解数独~~~ 可能是因为:自己解数独很难! !
查看代码效果
需要的工具
Python 版本:3.5.4
主要思想
思路很简单:
替换每个空格首先列出可能的数字,然后进行详细搜索以解决数独问题。
数独的规则如下:
每个谜题由 9x9 的网格组成,线索编号位于不同的位置。 游戏的目标是用数字填充空的方格,以便每行、每列和 3x3 房子中不会出现重复的数字。
代码实现 # Point class class point():def __init__(self, x, y):self.x = xself.y = yself.available = []self.value = 0# 有空间吗? Number def rowNum(p,sudoku):# set 用于删除重复项,因为有多个 0。 row = set(sudoku[p.y*9: (p.y+1)*9])row.remove(0)return row# 空格所在的列号是多少 defcolNum(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//3block_y = p.y//3block = []start_point = block_y*3*9 + block_x*3for 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 可以放入 , 8, 9 defInitialize(sudoku):sudokuList = [ ]length = len(sudoku )forindex in range(length):# 找到需要填充的单位,即空格。 sudoku[index] == 0:p = point(index%9,index//9)for i in range(1, 10):# if (i is rowNum if not in blockNum(p, sudoku)) (p, sudoku)) 和 (不在 colNum(p, sudoku)) 和 (不在 blockNum(p, sudoku)):p.available.append(i)sudokuList.append(p)return sudokuList#填空后,检查数字是否满足数独规则。 def check(p, sudoku):if p.value == 0:return Falseif (p.value not in rowNum(p, sudoku)) and (p.value not incolNum(p, sudoku)) and (p.value not in blockNum(p, sudoku)):return Trueelse:return False# 显示数独结果 def showResult(sudoku):for r in range(9):for c in range(9):print("%d " % (sudoku) [r*9+c]), end="")print("")# 高级搜索解数独 defsolve(p, sudoku):available_Num = p.availablefor ava in available_Num:p.value = avaif check(p,数独):数独[p.y*9+p.x] = p.valueif len(sudokuList)
评论前必须登录!
注册