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用来获得图片exif信息的库实例分析
Mar 16 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
Python heapq使用详解及实例代码
Jan 25 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
多个应用共存的Django配置方法
May 30 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
python 抓取知乎指定回答下视频的方法
Jul 09 Python
基于python实现简单网页服务器代码实例
Sep 14 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
python drf各类组件的用法和作用
Jan 12 Python
PyQt5通过信号实现MVC的示例
Feb 06 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中的Swoole
2016/04/05 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
Javascript 自定义类型方法小结
2010/03/02 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
JS定时器实例
2013/04/17 Javascript
javascript学习笔记(三)BOM和DOM详解
2014/09/30 Javascript
理解JavaScript中Promise的使用
2016/01/18 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
vue2.0与bootstrap3实现列表分页效果
2017/11/28 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
使用 Angular RouteReuseStrategy 缓存(路由)组件的实例代码
2019/11/01 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
python实现复制整个目录的方法
2015/05/12 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
css sprite简单实例
2016/05/23 HTML / CSS
介绍一下Java中的static关键字
2012/05/12 面试题
师范大学应届生求职信
2013/11/21 职场文书
实习生的自我评价
2014/01/08 职场文书
中秋节超市促销方案
2014/01/30 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
领导干部遵守党的政治纪律情况思想汇报
2014/09/14 职场文书
2014年质检员工作总结
2014/11/18 职场文书
中标通知书格式
2015/04/17 职场文书
mysql对于模糊查询like的一些汇总
2021/05/09 MySQL
Li list-style-image 图片垂直居中实现方法
2023/05/21 HTML / CSS