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 相关文章推荐
Python3使用requests登录人人影视网站的方法
May 11 Python
机器学习经典算法-logistic回归代码详解
Dec 22 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
python对文件的操作方法汇总
Feb 28 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
python实现PDF中表格转化为Excel的方法
Jun 16 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
Python 中的Sympy详细使用
Aug 07 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
让你的PHP同时支持GIF、png、JPEG
2006/10/09 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
功能强大的php文件上传类
2016/08/29 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
My Desktop :) 桌面式代码
2008/12/29 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
使用iframe window的scroll方法控制iframe页面滚动
2014/03/05 Javascript
select多选 multiple的使用示例
2014/06/16 Javascript
jQuery中ajax的load()与post()方法实例详解
2016/01/05 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
js制作提示框插件
2020/12/24 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
Python出现segfault错误解决方法
2016/04/16 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
对Pycharm创建py文件时自定义头部模板的方法详解
2019/02/12 Python
python把1变成01的步骤总结
2019/02/27 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
基于opencv的selenium滑动验证码的实现
2020/07/24 Python
CSS3 实现弹跳的小球动画
2020/10/26 HTML / CSS
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
企业领导班子四风对照检查材料
2014/09/27 职场文书
领导干部群众路线对照检查材料
2014/11/05 职场文书
2015毕业实习推荐信
2015/03/23 职场文书
高中班主任心得体会
2016/01/07 职场文书
Python turtle实现贪吃蛇游戏
2021/06/18 Python
python实现局部图像放大
2021/11/17 Python