python解數獨的簡單優化
原始程式
import sys def same_row(i,j): return (i//9 == j//9) def same_col(i,j): return (i-j) % 9 == 0 def same_block(i,j): return (i//27 == j//27 and i%9//3 == j%9//3) def r(a): i = a.find('0') if i == -1: sys.exit(a) excluded_numbers = set() for j in range(81): if same_row(i,j) or same_col(i,j) or same_block(i,j): excluded_numbers.add(a[j]) for m in '123456789': if m not in excluded_numbers: r(a[:i]+m+a[i+1:]) if __name__ == '__main__': if len(sys.argv) == 2 and len(sys.argv[1]) == 81: r(sys.argv[1]) else: print ("Usage: python sudoku.py puzzle")
注意第2步,迴圈了81次,而與一個格子相關的只有27個格,分別是同行、同列、同方塊各9個格。因此可以優化。其中每個方向或方塊,原格子本身不算在內。值為0的格也不算。
修改後:
import sys def r(a): i = a.find('0') if i == -1: sys.exit(a) excluded_numbers = set() for j in range(i//9*9,i//9*9+9): #same row if j!=i: excluded_numbers.add(a[j]) for j in range(0*9+i%9,9*9+i%9,9): #same col if j!=i: excluded_numbers.add(a[j]) r0=i//27*3 #blk 1st row c0=i%9//3*3 #blk 1st col for j in range(9): #same blk if (r0+j//3)*9+c0+j%3!=i: excluded_numbers.add(a[(r0+j//3)*9+c0+j%3]) for m in '123456789': if m not in excluded_numbers: r(a[:i]+m+a[i+1:]) if __name__ == '__main__': if len(sys.argv) == 2 and len(sys.argv[1]) == 81: r(sys.argv[1]) else: print ("Usage: python sudoku.py puzzle")
注:本程式碼適用於python 3,如果要用python 2,把程式中的“//”替換為“/”,並去掉print後的圓括號。
執行時間比較:
D:\>\timer python sudoku25.py 200370009009200007001004002050000800008000900006000040900100500800007600400089001 Timer 9.01 : Igor Pavlov : Public domain : 2009-05-31 284375169639218457571964382152496873348752916796831245967143528813527694425689731 Kernel Time = 0.078 = 13% User Time = 0.452 = 77% Process Time = 0.530 = 91% Global Time = 0.580 = 100% D:\>\timer python sudoku2.py 200370009009200007001004002050000800008000900006000040900100500800007600400089001 Timer 9.01 : Igor Pavlov : Public domain : 2009-05-31 284375169639218457571964382152496873348752916796831245967143528813527694425689731 Kernel Time = 0.046 = 1% User Time = 2.574 = 97% Process Time = 2.620 = 98% Global Time = 2.651 = 100% D:\>\timer python sudoku2.py 800000000003600000070090200050007000000045700000100030001000068008500010090000400 Timer 9.01 : Igor Pavlov : Public domain : 2009-05-31 812753649943682175675491283154237896369845721287169534521974368438526917796318452 Kernel Time = 0.093 = 1% User Time = 6.286 = 97% Process Time = 6.380 = 99% Global Time = 6.417 = 100% D:\>\timer python sudoku25.py 800000000003600000070090200050007000000045700000100030001000068008500010090000400 Timer 9.01 : Igor Pavlov : Public domain : 2009-05-31 812753649943682175675491283154237896369845721287169534521974368438526917796318452 Kernel Time = 0.062 = 4% User Time = 1.170 = 93% Process Time = 1.232 = 98% Global Time = 1.255 = 100%
相關文章
- PL/SQL解數獨在簡單優化基礎上的改進SQL優化
- JS簡單的倒數計時(程式碼優化)JS優化
- react 簡單優化React優化
- msyql 簡單的sql優化SQL優化
- 關於一個最簡單的數獨解題實現與疑惑一
- 圖片即時優化的三種簡單解決方案優化
- MySQL幾個簡單SQL的優化MySql優化
- 10種簡單的Java效能優化Java優化
- 簡單說兩句 Like 的優化優化
- 簡單優化容器服務優化
- nginx部署及簡單優化Nginx優化
- greenplum 簡單sql優化案例SQL優化
- 數值最優化—優化問題的解(二)優化
- Python變數的簡單知識Python變數
- 一次簡單的分頁優化優化
- 調需式優化的簡單實踐優化
- 34條簡單的SQL優化準則SQL優化
- 一次簡單的程式碼優化優化
- 簡單介紹python format格式化和數字格式化PythonORM
- java解數獨Java
- Hive的壓縮儲存和簡單優化Hive優化
- 優化Go程式的簡單技巧 - stephen.sh優化Go
- [譯]深度學習模型的簡單優化技巧深度學習模型優化
- JS 程式碼的簡單重構與優化JS優化
- 優化 MySQL: 3 個簡單的小調整優化MySql
- 每秒執行6000的簡單SQL優化(一)SQL優化
- 每秒執行6000的簡單SQL優化(二)SQL優化
- 簡單常用的幾項程式碼優化方法優化
- 簡單介紹Oracle的RBO/CBO優化器Oracle優化
- resize和scroll事件優化簡單方法事件優化
- 簡單說說PHP優化那些事PHP優化
- 一個解數獨的程式
- 一個利用DLX演算法的Python解數獨程式演算法Python
- EasyDependency:簡單優雅管理元件化的依賴配置元件化
- php mysql 一個查詢優化的簡單例子PHPMySql優化單例
- 增加複合索引優化SQL的簡單過程索引優化SQL
- 簡單瞭解python爬蟲Python爬蟲
- 最難數獨的快速解法 - pythonPython