使用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:
運行結果一:
運行結果二:
運行結果三:
運行結果四:
※程序員回到家的生活狀態
※學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?