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内置函数的用法实例教程
Sep 08 Python
深入理解python对json的操作总结
Jan 05 Python
Python内置函数 next的具体使用方法
Nov 24 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
Python2.7下安装Scrapy框架步骤教程
Dec 22 Python
磁盘垃圾文件清理器python代码实现
Aug 24 Python
python使用zip将list转为json的方法
Dec 31 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
python批量创建指定名称的文件夹
Mar 21 Python
python禁用键鼠与提权代码实例
Aug 16 Python
自学python用什么系统好
Jun 23 Python
python实现无边框进度条的实例代码
Dec 30 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桌面中心(三) 修改数据库
2007/03/11 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
学习YUI.Ext 第二天
2007/03/10 Javascript
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
js函数的引用, 关于内存的开销
2012/09/17 Javascript
只需一行代码,轻松实现一个在线编辑器
2013/11/12 Javascript
Jquery日期选择datepicker插件用法实例分析
2015/06/08 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
layui radio性别单选框赋值方法
2018/08/15 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
python复制文件的方法实例详解
2015/05/22 Python
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
Python smallseg分词用法实例分析
2015/05/28 Python
详解Django通用视图中的函数包装
2015/07/21 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
python3 爬取图片的实例代码
2018/11/06 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python3的socket使用方法详解
2020/02/18 Python
Python可变对象与不可变对象原理解析
2020/02/25 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
求职信写作要突出重点
2014/01/01 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
新闻编辑求职信
2014/07/13 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
小学新教师个人总结
2015/02/05 职场文书
内乡县衙导游词
2015/02/05 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
小学校长开学致辞
2015/07/29 职场文书
2016年母亲节广告语
2016/01/28 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL