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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
Python操作串口的方法
Jun 17 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
Python Flask框架模板操作实例分析
May 03 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
Python flask框架端口失效解决方案
Jun 04 Python
python实现npy格式文件转换为txt文件操作
Jul 01 Python
如何利用python之wxpy模块玩转微信
Aug 17 Python
Python3中最常用的5种线程锁实例总结
Jul 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 Token(令牌)设计
2008/03/15 PHP
php Http_Template_IT类库进行模板替换
2009/03/19 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
php设计模式之委托模式
2016/02/13 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
使用JS 清空File控件的路径值
2013/07/08 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
Javascript中的默认参数详解
2014/10/22 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
分享9点个人认为比较重要的javascript 编程技巧
2015/04/27 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
Javascript中字符串和数字的操作方法整理
2017/01/22 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
Python3实现定时任务的四种方式
2019/06/03 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
Django xadmin安装及使用详解
2020/10/26 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
2021/03/03 Python
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
外语系毕业生找工作的求职信
2013/11/28 职场文书
初三学习计划书范文
2014/04/30 职场文书
2014幼儿园保育员工作总结
2014/11/10 职场文书
拿破仑传读书笔记
2015/07/01 职场文书
一起来学习Python的元组和列表
2022/03/13 Python