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 相关文章推荐
windows下安装python paramiko模块的代码
Feb 10 Python
python中Genarator函数用法分析
Apr 08 Python
两个使用Python脚本操作文件的小示例分享
Aug 27 Python
Python 3中print函数的使用方法总结
Aug 08 Python
Python基于列表list实现的CRUD操作功能示例
Jan 05 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python+opencv+caffe+摄像头做目标检测的实例代码
Aug 03 Python
解决python Markdown模块乱码的问题
Feb 14 Python
解决import tensorflow as tf 出错的原因
Apr 16 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
keras:model.compile损失函数的用法
Jul 01 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 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代码
2010/02/16 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
javascript Math.random()随机数函数
2009/11/04 Javascript
JQuery实现倒计时按钮的实现代码
2012/03/23 Javascript
编写针对IE的JS代码两种编写方法
2013/01/30 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
jquery对table做排序操作的实例演示
2017/08/10 jQuery
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
Vue中跨域及打包部署到nginx跨域设置方法
2019/08/26 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
python解析中国天气网的天气数据
2014/03/21 Python
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python探索之pLSA实现代码
2017/10/25 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Jupyter Notebook的连接密码 token查询方式
2020/04/21 Python
python入门教程之基本算术运算符
2020/11/13 Python
css3 图片圆形显示 如何CSS将正方形图片显示为圆形图片布局
2014/10/10 HTML / CSS
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
上课玩手机检讨书
2014/02/08 职场文书
金融学专科生自我鉴定
2014/02/21 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
乡镇综治宣传月活动总结
2014/07/02 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
2014年流动人口工作总结
2014/11/26 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
幼师中班个人总结
2015/02/12 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
公司搬迁通知
2015/04/20 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
重阳节主题班会
2015/08/17 职场文书
2016班级元旦联欢会开幕词
2016/03/04 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL