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操作xml文件详细介绍
Jun 09 Python
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
python使用fork实现守护进程的方法
Nov 16 Python
pandas.DataFrame.to_json按行转json的方法
Jun 05 Python
TensorFlow的权值更新方法
Jun 14 Python
python 美化输出信息的实例
Oct 15 Python
Python登录系统界面实现详解
Jun 25 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
用python中的matplotlib绘制方程图像代码
Nov 21 Python
Django2 连接MySQL及model测试实例分析
Dec 10 Python
pytorch实现线性拟合方式
Jan 15 Python
Django Model层F,Q对象和聚合函数原理解析
Nov 12 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导入Excel到MySQL的方法
2011/04/23 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
基于JQuery的密码强度验证代码
2010/03/01 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
Angularjs中使用指令绑定点击事件的方法
2017/03/30 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
vue-router 中 meta的用法详解
2019/11/01 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
Python continue语句用法实例
2014/03/11 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python实现简单socket通信的方法
2016/04/19 Python
深入浅析python with语句简介
2018/04/11 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
Pycharm修改python路径过程图解
2020/05/22 Python
浅谈css3中calc在less编译时被计算的解决办法
2017/12/04 HTML / CSS
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
任意存:BOXFUL
2018/05/21 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
技校毕业生的自我评价
2013/12/27 职场文书
销售职业生涯规划范文
2014/03/14 职场文书
MySQL索引失效的典型案例
2021/06/05 MySQL
利用python进行数据加载
2021/06/20 Python
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis