python實(shí)現(xiàn)數(shù)獨(dú)算法實(shí)例
本文實(shí)例講述了python實(shí)現(xiàn)數(shù)獨(dú)算法的方法。分享給大家供大家參考。具體如下:
# -*- 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行 進(jìn)行驗(yàn)證 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行 進(jìn)行驗(yàn)證 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行 進(jìn)行驗(yàn)證 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))
希望本文所述對(duì)大家的Python程序設(shè)計(jì)有所幫助。
- 150行Python代碼實(shí)現(xiàn)帶界面的數(shù)獨(dú)游戲
- 用Python解數(shù)獨(dú)的方法示例
- Python判斷有效的數(shù)獨(dú)算法示例
- python實(shí)現(xiàn)自動(dòng)解數(shù)獨(dú)小程序
- python3.6數(shù)獨(dú)問(wèn)題的解決
- python實(shí)現(xiàn)數(shù)獨(dú)游戲 java簡(jiǎn)單實(shí)現(xiàn)數(shù)獨(dú)游戲
- 簡(jiǎn)單實(shí)現(xiàn)python數(shù)獨(dú)游戲
- python實(shí)現(xiàn)解數(shù)獨(dú)程序代碼
- Python如何判斷數(shù)獨(dú)是否合法
- Python圖像識(shí)別+KNN求解數(shù)獨(dú)的實(shí)現(xiàn)
相關(guān)文章
如何將python的數(shù)據(jù)存儲(chǔ)到mysql數(shù)據(jù)庫(kù)中
在很多數(shù)據(jù)處理項(xiàng)目中,將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)中是非常常見(jiàn)的操作,下面這篇文章主要給大家介紹了關(guān)于如何將python的數(shù)據(jù)存儲(chǔ)到mysql數(shù)據(jù)庫(kù)中的相關(guān)資料,需要的朋友可以參考下2023-12-12anaconda中Conda創(chuàng)建虛擬環(huán)境的實(shí)現(xiàn)步驟
在Anaconda中,可以使用conda命令來(lái)創(chuàng)建和管理虛擬環(huán)境,本文主要介紹了anaconda中Conda創(chuàng)建虛擬環(huán)境的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12Python用requests-html爬取網(wǎng)頁(yè)的實(shí)現(xiàn)
本文主要介紹了Python用requests-html爬取網(wǎng)頁(yè)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07Python3遍歷目錄樹(shù)實(shí)現(xiàn)方法
這篇文章主要介紹了Python3遍歷目錄樹(shù)實(shí)現(xiàn)方法,涉及Python目錄樹(shù)的遍歷操作技巧,需要的朋友可以參考下2015-05-05python實(shí)現(xiàn)網(wǎng)站的模擬登錄
這篇文章主要介紹了python實(shí)現(xiàn)網(wǎng)站的模擬登錄的相關(guān)資料,通過(guò)自己構(gòu)造post數(shù)據(jù)來(lái)用Python實(shí)現(xiàn)登錄過(guò)程,需要的朋友可以參考下2016-01-01python入門(mén)教程之識(shí)別驗(yàn)證碼
這篇文章主要介紹了python中識(shí)別驗(yàn)證碼的相關(guān)資料,這屬于學(xué)習(xí)python的基本入門(mén)教程,文中介紹的非常詳細(xì),文末也給出了完整的示例代碼,需要的朋友們可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-03-03python 從csv讀數(shù)據(jù)到mysql的實(shí)例
今天小編就為大家分享一篇python 從csv讀數(shù)據(jù)到mysql的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06