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 if语句知识点用法总结
Jun 10 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
对python模块中多个类的用法详解
Jan 10 Python
django 自定义过滤器的实现
Feb 26 Python
浅谈PYTHON 关于文件的操作
Mar 19 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
Aug 27 Python
Django之模板层的实现代码
Sep 09 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
Jul 09 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
用python读取xlsx文件
Dec 17 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 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常用的文件操作函数经典收藏
2013/04/02 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
浅析php原型模式
2014/11/25 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
键盘KeyCode值列表汇总
2013/11/26 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
js设置和获取自定义属性的方法
2016/10/20 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
js实现随机点名功能
2020/12/23 Javascript
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
用python写一个windows下的定时关机脚本(推荐)
2017/03/21 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
python机器学习之随机森林(七)
2018/03/26 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
2019/08/30 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
如何在python中判断变量的类型
2020/07/29 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
python爬虫中抓取指数的实例讲解
2020/12/01 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
国际书籍零售商:Wordery
2017/11/01 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
体育专业学生自我评价范文
2014/01/17 职场文书
爱国主义教育活动总结
2014/05/07 职场文书
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers