本文实例讲述了python实现数独算法的方法。分享给大家供大家参考。具体如下:

# -*- coding: utf-8 -*-

'''

Created on 2012-10-5

@author: Administrator

'''

from collections import defaultdict

import itertools

a = [

[ 0, 7, 0, 0, 0, 0, 0, 0, 0], #0

[ 5, 0, 3, 0, 0, 6, 0, 0, 0], #1

[ 0, 6, 2, 0, 8, 0, 7, 0, 0], #2

#

[ 0, 0, 0, 3, 0, 2, 0, 5, 0], #3

[ 0, 0, 4, 0, 1, 0, 3, 0, 0], #4

[ 0, 2, 0, 9, 0, 5, 0, 0, 0], #5

#

[ 0, 0, 1, 0, 3, 0, 5, 9, 0], #6

[ 0, 0, 0, 4, 0, 0, 6, 0, 3], #7

[ 0, 0, 0, 0, 0, 0, 0, 2, 0], #8

# 0, 1, 2, 3,|4, 5, 6,|7, 8

]

#a = [

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #0

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #1

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #2

# #

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #3

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #4

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #5

# #

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #6

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #7

# [0, 0, 0, 0, 0, 0, 0, 0, 0], #8

## 0, 1, 2, 3,|4, 5, 6,|7, 8

# ]

exists_d = dict((((h_idx, y_idx), v) for h_idx, y in enumerate(a) for y_idx , v in enumerate(y) if v))

h_exist = defaultdict(dict)

v_exist = defaultdict(dict)

for k, v in exists_d.items():

h_exist[k[ 0]][k[ 1]] = v

v_exist[k[ 1]][k[ 0]] = v

aa = list(itertools.permutations(range(1, 10), 9))

h_d = {}

for hk, hv in h_exist.items():

x = filter(lambda x:all((x[k] == v for k, v in hv.items())), aa)

x = filter(lambda x:all((x[vk] != v for vk , vv in v_exist.items() for k, v in vv.items() if k != hk)), x)

# print x

h_d[hk] = x

def test(x, y):

return all([y[i] not in [x_[i] for x_ in x] for i in range(len(y)) ])

def test2(x):

return len(set(x)) != 9

s = set(range(9))

sudokus = []

for l0 in h_d[0 ]:

for l1 in h_d[ 1]:

if not test((l0,), l1):

continue

for l2 in h_d[ 2]:

if not test((l0, l1), l2):

continue

# 1,2,3行 进行验证

if test2([l0[ 0], l0[ 1], l0[ 2]

, l1[ 0], l1[ 1], l1[ 2]

, l2[ 0], l2[ 1], l2[ 2]

]) : continue

if test2([l0[ 3], l0[ 4], l0[ 5]

, l1[ 3], l1[ 4], l1[ 5]

, l2[ 3], l2[ 4], l2[ 5]

]) : continue

if test2([l0[ 6], l0[ 7], l0[ 8]

, l1[ 6], l1[ 7], l1[ 8]

, l2[ 6], l2[ 7], l2[ 8]

]) : continue

for l3 in h_d[ 3]:

if not test((l0, l1, l2), l3):

continue

for l4 in h_d[ 4]:

if not test((l0, l1, l2, l3), l4):

continue

for l5 in h_d[ 5]:

if not test((l0, l1, l2, l3, l4), l5):

continue

# 4,5,6行 进行验证

if test2([l3[ 0], l3[ 1], l3[ 2]

, l4[ 0], l4[ 1], l4[ 2]

, l5[ 0], l5[ 1], l5[ 2]

]) : continue

if test2([l3[ 3], l3[ 4], l3[ 5]

, l4[ 3], l4[ 4], l4[ 5]

, l5[ 3], l5[ 4], l5[ 5]

]) : continue

if test2([l3[ 6], l3[ 7], l3[ 8]

, l4[ 6], l4[ 7], l4[ 8]

, l5[ 6], l5[ 7], l5[ 8]

]) : continue

for l6 in h_d[ 6]:

if not test((l0, l1, l2, l3, l4, l5,), l6):

continue

for l7 in h_d[ 7]:

if not test((l0, l1, l2, l3, l4, l5, l6), l7):

continue

for l8 in h_d[ 8]:

if not test((l0, l1, l2, l3, l4, l5, l6, l7), l8):

continue

# 7,8,9行 进行验证

if test2([l6[ 0], l6[ 1], l6[ 2]

, l7[0 ], l7[1 ], l7[2 ]

, l8[0 ], l8[1 ], l8[2 ]

]) : continue

if test2([l6[ 3], l6[ 4], l6[ 5]

, l7[3 ], l7[4 ], l7[5 ]

, l8[3 ], l8[4 ], l8[5 ]

]) : continue

if test2([l6[ 6], l6[ 7], l6[ 8]

, l7[6 ], l7[7 ], l7[8 ]

, l8[6 ], l8[7 ], l8[8 ]

]) : continue

print l0

print l1

print l2

print l3

print l4

print l5

print l6

print l7

print l8

sudokus.append((l0, l1, l2, l3, l4, l5, l6, l7, l8))

希望本文所述对大家的Python程序设计有所帮助。

完成数独的算法 python_python实现数独算法实例相关推荐

  1. 蚁群算法 python_Python蚁群算法实现

    时间:2018-12-12 概述:蚁群算法 Python蚁群算法实现,使用工具:Pycharm ,Python版本为3.6.3,作者:李劭明.使用蚁群算法得到各个城市间的距离,下面来看详细的代码: i ...

  2. 面试题目_经典面试题目「回溯算法」解数独

    解数独,理解二维递归是关键! 通知:我将公众号文章和学习相关的资料整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家 ...

  3. JAVA代码—算法基础:数独问题(Sodoku Puzzles)

    JAVA代码-算法基础:数独问题(Sodoku Puzzles) 数独问题(Sodoku Puzzles) 数独游戏(日语:数独 すうどく)是一种源自18世纪末的瑞士的游戏,后在美国发展.并在日本得以 ...

  4. python数独伪代码回溯法_数独 #回溯算法 #CTF

    1. intro:巅峰极客的一道逆向 刷巅峰极客2020里的rev题fu!kpy,复杂得不行但是看到if d[1][0] != '8' or d[1][7] != '2'和if check(h1) ! ...

  5. 算法实践:数独(3)

    数独(3) 描述 为了寻回百年前与公主一起的记忆碎片,林克历尽千辛万苦总算破解了数独试炼I和II的谜题,寻回50%的记忆碎片. 如今,摆在他面前是数独试炼III--传说中的靶形数独(通过后可以获得剩下 ...

  6. crc16检验 python_Python CRC16校验算法

    def crc16(x, invert): a = 0xFFFF b = 0xA001 for byte in x: a ^= ord(byte) for i in range(8): last = ...

  7. python图像数独_Python图像识别+KNN求解数独的实现

    Python-opencv+KNN求解数独 最近一直在玩数独,突发奇想实现图像识别求解数独,输入到输出平均需要0.5s. 整体思路大概就是识别出图中数字生成list,然后求解. 输入输出demo 数独 ...

  8. (附代码)数独大作业【读取数独,解数独,生成唯一解数独(随机,特定形状,不同难度生成),玩数独】

    注:未经同意不要转载. 上学期简单的做了一个数独程序,实现了一些功能,想简单的为大家提供的思路. 为了避免某些情况出现,具体代码暂时先不发了,有不太懂的地方可以评论提问啊. 下面是我的具体报告: 一, ...

  9. python数独伪代码回溯法_数独的暴力回溯解法和Python GUI

    数独起源于18世纪初瑞士数学家欧拉等人研究的拉丁方阵,20世纪70年代,经过美国及日本学者的推广和改良,定名为数独(Sudoku),大致的意思是"独个的数字"或"只出现一 ...

最新文章

  1. XIV(5)-- Data Recovery Protection (XDRP)
  2. 智能合约WASM语言 (1)概述
  3. Ubuntu apt-get方式安装Subversion
  4. Android 应用基础知识(6)---本地化
  5. mysql 数据库缓冲池_MySQL5.6新特性快速预热Buffer_Pool缓冲池
  6. DevOps:让开发和运维告别“相爱相杀”
  7. mysql sql自动优化_SQL语句的自动优化_MySQL
  8. Class类的使用和背后实现的原理
  9. Android 11 正式版发布
  10. 飞天5K实战经验:大规模分布式系统运维实践
  11. R countcolors包:像素级分析处理图片
  12. 解决win10睡眠后变卡的问题
  13. 周鸿祎方法论:吊丝如何逆转未来
  14. 【算法基础】一维前缀和 + 二维前缀和
  15. java生成word几种解决方案
  16. 计算机已达到最大连接数
  17. 菜鸟程序员自我修养心得
  18. python爬虫使用正则爬取网站
  19. 零售金融的数字化转型,金易联拥抱流量平台、提供在线展业服务
  20. Java怎么搞安卓日历提醒,Android日历有闹钟提醒功能记事功能等

热门文章

  1. 系统架构设计师 - 23种设计模式(GOF)
  2. react native笔记-个人记录-初始化工程遇到的问题
  3. docker-compose命令介绍和使用【官方英文文档翻译】【附加案例】
  4. QT中DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80040216 ()问题的解决
  5. C语言 __DATE__ - C语言零基础入门教程
  6. C语言 空指针 NULL - C语言零基础入门教程
  7. php是走什么协议,TCP是什么协议
  8. [LCP28] 采购方案
  9. html 切换主题,html切换主题实现方案
  10. 大学计算机课第二章内容总结,第四周市政系《大学计算机基础》课程总结