僅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
相關文章
- 求解數獨
- Cplex混合整數規劃求解(Python API)PythonAPI
- openGauss不僅程式碼開源
- 【機器學習】求解邏輯迴歸引數(三種方法程式碼實現)機器學習邏輯迴歸
- 斯特林數求解
- 最難數獨的快速解法 - pythonPython
- SmartCode—不僅僅是功能強大的程式碼生成器
- Add_Two_Numbers python 求解Python
- 程式設計題求解程式設計
- 網球迴圈賽思路 - 分治法求解(無程式碼)
- Python實現類別變數的獨熱編碼(One-hot Encoding)Python變數Encoding
- python獲取命令列引數的程式碼Python命令列
- Python純程式碼 取組合數結果Python
- 大數翻倍法求解CRT
- python+gurobi求解排班問題Python
- python多程式簡介,和VNPY多程式引數優化程式碼分析Python優化
- 識別英文數字驗證碼的程式(Python示例)Python
- Jmeter 切換中文亂碼,求解JMeter
- python程式碼打包exe程式Python
- 全渠道定價、庫存決策,混合整數規劃建模求解,MNL選擇模型,內附程式碼!模型
- 表示式求解(非一位數)
- 梯度下降法中導數的求解梯度
- uniapp js 數獨小遊戲 寫死的簡單數獨 數獨 3.0APPJS遊戲
- 關於反射的導致panic的一段程式碼,求解答反射
- 求區間不同數的個數【主席樹求解】
- [WebAssembly 入門] 實現數獨遊戲 - 如何優雅的組織Rust程式碼Web遊戲Rust
- 標籤編碼、獨熱編碼大不同 - Python 實現Python
- Python求解線性規劃——PuLP使用教程PythonPulp
- 印度獨角獸數量僅次中美 分佈行業和投資熱點在哪裡?行業
- Python程式py程式碼加密方法Python加密
- python常用程式碼整理Python
- 逆向常用python程式碼Python
- python神祕程式碼Python
- 回溯演算法求解橋本分數式演算法
- 伯努利數,求解自然數冪和的關鍵係數
- Python程式碼混淆工具,Python原始碼保密、加密、混淆Python原始碼加密
- 微信小程式系統獨立原始碼部署微信小程式原始碼
- “數學即程式碼”是一種概念,強調數學和程式設計之間的緊密聯絡。它認為程式設計不僅僅是寫程式碼,而是透過數學思維來解決問題和實現演算法。以下是一些具體的應用和例子,展示瞭如何將數學概念轉化為程式碼:程式設計演算法