加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python实现数独算法实例

发布时间:2020-12-16 22:44:05 所属栏目:Python 来源:网络整理
导读:本篇章节讲解python实现数独算法的方法。供大家参考研究。具体如下: # -*- coding: utf-8 -*-'''Created on 2012-10-5@author: Administrator'''from collections import defaultdictimport itertoolsa = [ [ 0,7,0],#0 [ 5,3,6,#1 [ 0,2,8,#2 # [

本篇章节讲解python实现数独算法的方法。分享给大家供大家参考。具体如下:

# -*- coding: utf-8 -*-
'''
Created on 2012-10-5
@author: Administrator
'''
from collections import defaultdict
import itertools
a = [
  [ 0,7,0],#0
  [ 5,3,6,#1
  [ 0,2,8,#2
  #
  [ 0,5,#3
  [ 0,4,1,#4
  [ 0,9,#5
  #
  [ 0,#6
  [ 0,3],#7
  [ 0,#8
#  0,|4,|7,8
  ]
#a = [
#  [0,#0
#  [0,#1
#  [0,#2
#  #
#  [0,#3
#  [0,#4
#  [0,#5
#  #
#  [0,#6
#  [0,#7
#  [0,#8
##  0,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,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,l2,l3),l4):
      continue
     for l5 in h_d[ 5]:
      if not test((l0,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,l4,l5,l6):
        continue
       for l7 in h_d[ 7]:
        if not test((l0,l6),l7):
         continue
        for l8 in h_d[ 8]:
         if not test((l0,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,l7,l8))

希望本文所述对大家的Python程序设计有所帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读