python实现数独算法实例
更新时间:2015年06月09日 18:17:32 作者:不吃皮蛋
这篇文章主要介绍了python实现数独算法,实例分析了Python数独算法的实现技巧,需要的朋友可以参考下
本文实例讲述了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程序设计有所帮助。
相关文章
linux mint中搜狗输入法导致pycharm卡死的问题
这篇文章主要介绍了linux mint中搜狗输入法导致pycharm卡死的问题,这篇文章给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10
用 Python 定义 Schema 并生成 Parquet 文件详情
本文将演示两个例子,一个是没有层级的两个字段,另一个是含于嵌套级别的字段,将要使用到的 Python 模块有 pandas 和 pyarrow,感兴趣是我小伙伴请和小编一起学习下面文章内容吧2021-09-09
Broadcast广播机制在Pytorch Tensor Numpy中的使用详解
python中Broadcast机制非常实用,在python中的广播机制其实很简单,下方主要介绍Broadcast广播机制在Pytorch Tensor Numpy中的使用,希望对你有所帮助2022-08-08
使用wxPython和Pandas实现XLSX分析器和网页打开器
这篇文章主要为大家详细介绍了如何使用wxPython和Pandas实现XLSX分析器和网页打开器,文中的示例代码讲解详细,感兴趣的可以了解一下2024-10-10


最新评论