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中每次处理一个字符的5种方法
May 21 Python
python检测是文件还是目录的方法
Jul 03 Python
Python3 模块、包调用&路径详解
Oct 25 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
Python中使用__new__实现单例模式并解析
Jun 25 Python
python SVD压缩图像的实现代码
Nov 05 Python
Python实现微信好友的数据分析
Dec 16 Python
pygame实现弹球游戏
Apr 14 Python
解决pycharm安装第三方库失败的问题
May 09 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 Python
在Windows下安装配置CPU版的PyTorch的方法
Apr 02 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
mysql 搜索之简单应用
2007/04/27 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
基于ThinkPHP实现批量删除
2015/12/18 PHP
php 类中的常量、静态属性、非静态属性的区别
2017/04/09 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
jQuery语法高亮插件支持各种程序源代码语法着色加亮
2013/04/27 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
bootstrap学习笔记之初识bootstrap
2016/06/21 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
JS自动生成动态HTML验证码页面
2017/06/14 Javascript
React-Native中props具体使用详解
2017/09/04 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
Python不规范的日期字符串处理类
2014/06/10 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
django框架单表操作之增删改实例分析
2019/12/16 Python
python字符串判断密码强弱
2020/03/18 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
外企财务年会演讲稿
2014/01/03 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
学校少先队工作总结
2015/08/12 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript