python实现数独算法实例


Posted in Python onJune 09, 2015

本文实例讲述了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使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
详解Python3中的Sequence type的使用
Aug 01 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
python 网络编程常用代码段
Aug 28 Python
python常用知识梳理(必看篇)
Mar 23 Python
Python正则表达式非贪婪、多行匹配功能示例
Aug 08 Python
在Python 字典中一键对应多个值的实例
Feb 03 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
python连接mongodb集群方法详解
Feb 13 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
Python类class参数self原理解析
Nov 19 Python
Python基础之hashlib模块详解
May 06 Python
python中的全局变量用法分析
Jun 09 #Python
python简单实现计算过期时间的方法
Jun 09 #Python
Python扫描IP段查看指定端口是否开放的方法
Jun 09 #Python
Python实现数据库编程方法详解
Jun 09 #Python
Python读写文件方法总结
Jun 09 #Python
六个窍门助你提高Python运行效率
Jun 09 #Python
python数组复制拷贝的实现方法
Jun 09 #Python
You might like
如何选购合适的收音机
2021/03/01 无线电
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
60个很实用的jQuery代码开发技巧收集
2014/12/15 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
[50:58]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 Mineski vs EG
2018/04/03 DOTA
python中 chr unichr ord函数的实例详解
2017/08/06 Python
python使用OpenCV模块实现图像的融合示例代码
2020/04/10 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
python模拟实现分发扑克牌
2020/04/22 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
酒店管理专业自荐信
2014/05/23 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
2014年小学工作总结
2014/11/26 职场文书
优质服务标语口号
2015/12/26 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android