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正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
Python使用minidom读写xml的方法
Jun 03 Python
Python通过poll实现异步IO的方法
Jun 04 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
Python操作MongoDB详解及实例
May 18 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
May 11 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 Python
详解Python打包分发工具setuptools
Aug 05 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
python实现三壶谜题的示例详解
Nov 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
php 什么是PEAR?(第二篇)
2009/03/19 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
php与paypal整合方法
2010/11/28 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
ThinkPHP的URL重写问题
2014/06/22 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
php制作动态随机验证码
2015/02/12 PHP
PHP+ajax分页实例简析
2015/12/07 PHP
PHP身份证校验码计算方法
2016/08/10 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
谈一谈javascript中继承的多种方式
2016/02/19 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
Python秒算24点实现及原理详解
2019/07/29 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
python生成并处理uuid的实现方式
2020/03/03 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
俄罗斯建筑和装饰材料在线商店:Stroilandia
2020/07/25 全球购物
学校学习雷锋活动总结
2014/07/03 职场文书
励志演讲稿大全
2014/08/21 职场文书
党员个人公开承诺书
2014/08/29 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
商铺门面租房协议书
2014/10/21 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
Oracle数据库事务的开启与结束详解
2022/06/25 Oracle