僅50行Python程式碼!數獨求解!4秒!
可讀性極高,直接上程式碼
遞迴求解
import numpy as np
from copy import deepcopy
def solve_recursion(pad, only_one_solve=True):
'''遞迴求法'''
pad = deepcopy(pad)
pad = np.array(pad)
pos = [-1, -1] # 用來存放第一個未知數的位置
possible = [] # 第一個未知數的位置可能的取值
solves = [] # 解集
if pad.max() > 9 or pad.min() < 0 or pad.shape != (9, 9): # 異常保護
raise ValueError("wtf of input value?")
for y in range(9): # 得到第一個未知數的位置
if pos[0] != -1 and pos[1] != -1: # 如果已經找到第一個未知數的位置
break
for x in range(9):
if pad[y][x] == 0:
pos = [x, y]
break
if pos[0] == -1 and pos[1] == -1: # 第一個未知數的位置沒找到,說明已經沒有未知數了,已經解完
print("find")
return [pad]
for k in range(1, 9 + 1):
x = pos[0]
y = pos[1]
# 這一行內是否有k
row = pad[y, :]
if k in row:
continue
# 這一列內是否有k
col = pad[:, x]
if k in col:
continue
# 九宮格內是否有k
box = pad[y - y % 3:y - y % 3 + 3, x - x % 3:x - x % 3 + 3] # 切片出九宮格
if k in box:
continue
possible.append(k) # 這個位置為k時與當前已知情況不衝突
if len(possible) == 0: # 填什麼都不滿足當前的情況,無解
return None
for i in range(len(possible)):
y = pos[1]
x = pos[0]
pad[y][x] = possible[i] # 假設這個位置的數
ret = self.solve_recursion(pad, only_one_solve=only_one_solve) # 遞迴求解
if ret is None: # 無解
pass
elif isinstance(ret, list) and len(ret) == 0: # 還沒有解
pass
else: # 解集
if only_one_solve:
return ret
for j in range(len(ret)):
solves.append(ret[j])
return solves
傳入引數:
pad,9x9二維list,pad[y][x]即x,y處對應的值,0表示未知,1-9對應1-9。
only_one_solve:True:求到一個解就直接中斷求解,False:求完所有的解
返回值:
solves:解集list
相關文章
- 改進版的python求解數獨Python
- 另一個數獨求解c++程式C++
- 又一個數獨求解c++程式C++
- 我目前找到的最快的數獨求解程式
- 同樣演算法的Python和C求解數獨程式速度比較演算法Python
- [LeetCode] Sudoku Solver 求解數獨LeetCode
- 程式設計師不僅僅是寫程式碼程式設計師
- Cplex混合整數規劃求解(Python API)PythonAPI
- 【機器學習】求解邏輯迴歸引數(三種方法程式碼實現)機器學習邏輯迴歸
- 一個利用DLX演算法的Python解數獨程式演算法Python
- 一個解數獨的程式
- 最難數獨的快速解法 - pythonPython
- 拿工資不僅僅是讓你寫程式碼的
- 網球迴圈賽思路 - 分治法求解(無程式碼)
- python解數獨的簡單優化Python優化
- openGauss不僅程式碼開源
- 新加坡總理公開多年前寫的數獨程式原始碼原始碼
- 程式設計題求解程式設計
- uniapp js 數獨小遊戲 寫死的簡單數獨 數獨 3.0APPJS遊戲
- 獨立開發者的程式碼簽名
- SmartCode—不僅僅是功能強大的程式碼生成器
- vue 數獨Vue
- 數獨遊戲遊戲
- Python實現類別變數的獨熱編碼(One-hot Encoding)Python變數Encoding
- 印度獨角獸數量僅次中美 分佈行業和投資熱點在哪裡?行業
- [WebAssembly 入門] 實現數獨遊戲 - 如何優雅的組織Rust程式碼Web遊戲Rust
- Add_Two_Numbers python 求解Python
- python+gurobi求解排班問題Python
- python獲取命令列引數的程式碼Python命令列
- Python實現程式碼行數統計工具Python
- Python純程式碼 取組合數結果Python
- 梯度下降法中導數的求解梯度
- java解數獨Java
- Python 工匠:善用變數來改善程式碼質量Python變數
- 微信小程式系統獨立原始碼部署微信小程式原始碼
- 小麥苗的常用程式碼(僅限自己使用)
- 全渠道定價、庫存決策,混合整數規劃建模求解,MNL選擇模型,內附程式碼!模型
- 【演算法詳解】求解數值的整數次方演算法