當前位置:
首頁 > 知識 > 使用Python編寫程序求解數獨遊戲答案

使用Python編寫程序求解數獨遊戲答案

問題描述:

數獨盤面是個九宮,每一宮又分為九個小格。在這八十一格中給出一定的已知數字和解題條件,利用邏輯和推理,在其他的空格上填入1-9的數字。使1-9每個數字在每一行、每一列和每一宮中都只出現一次,所以又稱「九宮格」。

解題建議:

遇到問題後,最好先手工推導和模擬一下,把思路理清楚,然後再動手寫代碼。

想要系統學習python和免費學習資料的 可以加裙 四七四五三四九五一

參考代碼:

import random

def init():

# 初始狀態,每個格內都是1-9之間的數字

grids = {(r, c):list(range(1,10))

for r in range(9) for c in range(9)}

# 根據文件中的位置和數字設置數獨遊戲初始狀態

with open("values.txt") as fp:

for line in fp:

line = line.strip()

if line == "0":

break

row, col, value = map(int, line.split(","))

grids[(row,col)] = value

return grids

def eachGrid(grids, row, col, value):

tempValue = grids[(row,col)]

# 刪除不可能的數字

if isinstance(tempValue, list):

if value in tempValue:

tempValue.remove(value)

# 如果格內只有一個數字,就拿出來填充

if len(tempValue) == 1:

grids[(row,col)] = tempValue[0]

def solve(oldGrids):

grids = oldGrids.copy()

for r in range(9):

for c in range(9):

value = grids[(r,c)]

if isinstance(value, int):

# 處理同一列

for rr in range(9):

eachGrid(grids, rr, c, value)

# 處理同一行

for cc in range(9):

eachGrid(grids, r, cc, value)

# 處理小九宮格內的數字

rowStart = r//3 * 3

colStart = c//3 * 3

for rr in range(rowStart, rowStart+3):

for cc in range(colStart, colStart+3):

eachGrid(grids, rr, cc, value)

elif isinstance(value, list) and len(value)==1:

# 當前格內只有一個數了,拿出來填充

grids[(r,c)] = value[0]

return grids

def output(grids):

"""輸出grids中的內容"""

for row in range(9):

for col in range(9):

value = grids[(row,col)]

if isinstance(value, int):

print(grids[(row,col)], end=" ")

else:

print(" ", end=" ")

print()

def check(grids):

"""檢查grids是否滿足數獨遊戲要求"""

for rc in range(9):

row =

if len(row) != 9:

return False

col =

if len(col) != 9:

return False

for row in range(0,9,3):

for col in range(0,9,3):

value =

if len(value) != 9:

return False

return True

def main(oldGrids):

grids = oldGrids.copy()

steps = 0

while True:

steps += 1

grids = solve(grids)

if steps > 20:

try:

position = [(r,c)

for r in range(9) for c in range(9)

if isinstance(grids[(r,c)],list)][0]

grids[position] = random.choice(grids[position])

except:

grids = oldGrids.copy()

steps = 0

continue

if all():

if check(grids):

return grids

else:

# 當前選擇無效,恢復原狀,選擇下一個

grids = oldGrids.copy()

steps = 0

grids = init()

output(grids)

result = main(grids)

print("="*30)

output(result)

print(check(result))

代碼中使用的文本文件values.txt中內容格式,以第一行為例,0,2,9表示第0行第2列的初始數字為9:

運行結果一:

運行結果二:

運行結果三:

運行結果四:


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT技術java交流 的精彩文章:

程序員回到家的生活狀態
學web前端開發寫給新手的建議,超實用!
H5-前端不常見但很實用的知識點,總有你不知道的
2017年,前端開發市場飽和了么
你想做的人工智慧夢,Python可以幫你實現!

TAG:IT技術java交流 |

您可能感興趣

Maison Margiela時裝秀:John Galliano仍然追求解脫
TensoFlow 實戰 3層網路求解嵌入詞向量,附代碼詳解
excel函數求解,數量較大,便捷方式求解
玩了這麼久OpenFOAM,你了解OpenFOAM中方程的求解演算法嗎?
粉絲提出《Produce X101》投票造假,要求解釋說明
斯坦福學生抗議蘋果:要求解決iPhone成癮問題
CSGO:簽證問題被留美國國內,NRG急求解決CeRq簽證問題
求解!我就是對穿 Air Jordan 的女生毫無抵抗力
Wanna one姜丹尼爾要求解約,疑與LM不和,粉絲怒了!
iPhone X鏡頭蓋掉落第二起!庫克求解釋
JDBC連接SQLsever2008出現錯誤,求解決
我的世界:那些腦迴路清奇的遊戲設定,玩家喊話Notch求解答
美參議員質疑亞馬遜Echo隱私問題 致信貝索斯求解釋
求解答,Selina到底有沒有跟他在一起啊!
數獨 回溯法求解
Bigbang4人服役,勝利開個人演唱會,現場連線GD,網友:跪求解散
GIF:這是什麼原理,求解?
李彥宏的「車焦慮」求解 Apollo駛上「高速路」
動力學問題的求解
遠古UP主12dora向B站認慫求解封 預購《古墓麗影:暗影》的都是250?