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%
相關文章
- uniapp js 數獨小遊戲 寫死的簡單數獨 數獨 3.0APPJS遊戲
- 關於一個最簡單的數獨解題實現與疑惑一
- nginx部署及簡單優化Nginx優化
- 簡單優化容器服務優化
- 數值最優化—優化問題的解(二)優化
- 一次簡單的分頁優化優化
- 簡單介紹python format格式化和數字格式化PythonORM
- [譯]深度學習模型的簡單優化技巧深度學習模型優化
- JS 程式碼的簡單重構與優化JS優化
- Hive的壓縮儲存和簡單優化Hive優化
- 優化Go程式的簡單技巧 - stephen.sh優化Go
- 簡單瞭解python爬蟲Python爬蟲
- EasyDependency:簡單優雅管理元件化的依賴配置元件化
- "簡單"的jvm調優JVM
- “簡單”的jvm調優JVM
- python多程式簡介,和VNPY多程式引數優化程式碼分析Python優化
- MySQL效能優化之簡單sql改寫MySql優化
- iOS 啟動速度優化和安裝包優化簡單總結iOS優化
- 最簡單的氣泡排序還能怎麼優化?排序優化
- Web自動化—簡單瞭解Web
- 對一條基於分割槽的簡單SQL的優化SQL優化
- 【python小練習】簡單的猜數字遊戲Python遊戲
- 最難數獨的快速解法 - pythonPython
- python中yield的用法詳解——最簡單,最清晰的解釋Python
- 簡單聊聊出海企業的數字化建設
- python:變數和簡單資料型別Python變數資料型別
- React.js 一次動畫效能的簡單優化ReactJS動畫優化
- Python線性優化基礎講解~Python優化
- 說說 Python 的變數以及簡單資料型別Python變數資料型別
- python3將變數輸入的簡單例項Python變數單例
- 瞭解Java物件,簡單聊聊JVM調優分析Java物件JVM
- Acwing166 數獨題解 - DFS剪枝最佳化
- Python實用技法第1篇:可迭代物件分解為單獨的變數Python物件變數
- Python enumerate():使用計數器簡化迴圈Python
- 用python手刃Leetcode(1):兩數之和【簡單題】PythonLeetCode
- XPROG: 簡單實用的魯棒優化(RO, DRO)程式語言優化
- 兩種簡單分析和優化MySQL資料庫表的方法優化MySql資料庫
- 瞭解開源視覺化表單的主要優勢視覺化
- Python中的單例模式的幾種實現方式的及優化Python單例模式優化