數獨(Sudoku)是一款大眾喜愛的數字邏輯游戲。玩家需要根據9X9盤面上的已知數字,推算出所有剩余空格的數字,并且滿足每一行、每一列、每一個粗線宮內的數字均含1-9,并且不重復。
輸入:
包含已知數字的9X9盤面數組[空缺位以數字0表示]
輸出:
完整的9X9盤面數組
0 9 2 4 8 1 7 6 34 1 3 7 6 2 9 8 58 6 7 3 5 9 4 1 26 2 4 1 9 5 3 7 87 5 9 8 4 3 1 2 61 3 8 6 2 7 5 9 42 7 1 5 3 8 6 4 93 8 6 9 1 4 2 5 70 4 5 2 7 6 8 3 1
5 9 2 4 8 1 7 6 34 1 3 7 6 2 9 8 58 6 7 3 5 9 4 1 26 2 4 1 9 5 3 7 87 5 9 8 4 3 1 2 61 3 8 6 2 7 5 9 42 7 1 5 3 8 6 4 93 8 6 9 1 4 2 5 79 4 5 2 7 6 8 3 1
對于這個題我們的第一思路當然是用深度遍歷加回溯法來完成。
首先將數字存在9*9的二維數組數據結構內,其次尋找值為0的元素,將其換成1到9任一個數字。
若能滿足稱為數獨的三個條件,則繼續往下搜索值為0的元素。
同樣將其換成0到9之間的任意數字,若發現所有的數字都不滿足條件的話,則回溯到上一個點,并把該點的值繼續換成其他數字。
直到所有的81個點都遍歷完,若遍歷完發現沒有滿足條件的值可以填滿值為0的位子,則返回False。
首先我們先寫一個函數來判斷數字num是否可以放到9*9矩陣的(row,col)位置上。
def check(matrix,row,col,value): """ 檢測在(row,col)放value是否合適 1.每行含1-9,不含重復值value 2.每列含1-9,不含重復值value 3.3*3區塊含1-9,不含重復值value """ #檢測每行 for j in range(9): if matrix[row][j]==value: return False #檢測每列 for i in range(9): if matrix[i][col]==value: return False # 檢測元素所在3*3區域 area_row=row//3*3 area_col=col//3*3 for i in range(area_row,area_row+3): for j in range(area_col,area_col+3): if matrix[i][j]==value: return False return True
然后我們就可以用回溯法來完成數獨游戲了:
def solveSudoku(matrix,count=0): """ 遍歷每一個未填元素,遍歷1-9替換為合適的數字 """ if count==81:#遞歸出口 return True row=count//9#行標 col=count%9#列標 if matrix[row][col]!=0:#已填充 return solveSudoku(matrix,count=count+1) else:#未填充 for i in range(1,10): if check(matrix,row,col,i):#找到可能的填充數 matrix[row][col]=i if solveSudoku(matrix,count=count+1):#是否可完成 return True#可完成 #不可完成 matrix[row][col]=0#回溯, i換個數繼續走 return False#不可完成matrix=[]for i in range(9): matrix.append(list(map(int,input().split())))# print(matrix)solveSudoku(matrix,0)# print(solveSudoku(matrix,0))# for i in range(9):# print (' '.join(map(str,matrix[i])))# print(matrix)for li in matrix: print(' '.join(list(map(str,li))))
這里值得注意的一點是,我們可以用遞歸函數來判斷,若我們將當前點的值設為 i 時,其余點是否可以完成數獨游戲,即:
for i in range(1,10): if check(matrix,row,col,i):#找到可能的填充數 matrix[row][col]=i if solveSudoku(matrix,count=count+1):#是否可完成 return True#可完成
如果不能完成的話,則回溯,我們這里只需要將matrix[row][col]設為0,然后讓他接著遍歷0-9中的其余數即可。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
如何買到最便宜的北京到昆明機票?2017年1月12日,北京至昆明特價機票經濟艙價格為1020;特價機票可以根據您的需求提前在芒果網預定!幾月份北京到昆明機票最便宜?每年6月底7月初最便宜。今年受流感影響,每年這個時候的機票折扣都是近年來最低的。有消息稱10號以后會漲,具體折扣還不確定?,F在6天往返機票不到8折。740元包含機場建設,現在東航、國航、海航都是這個價。北京到昆明的飛機票價多少?每天票價...
500元等于多少?答:3360500元可以等于500元。但是,從題目的問題中,我們可以猜測出多種情況。500元可以是、越南、等外幣。隨著世界貿易組織積極推動各國經濟發展,各國貨幣可以進入世界貿易進行兌換,但總體上還是以強國經濟為主。500元等于多少?500元相當于500元。元是,我國的貨幣單位。是的法定貨幣,是全國管理的主管機關,負責的設計、印制和發行。的單位是,的輔幣是分和美分。1元等于10角,...
用ps怎么做金屬牌子?1.首先新建一個800px*800px的畫布,命名為texture icon,在背景中添加圖層樣式。2.使用圓角矩形工具,繪制一個圓角半徑為90px的450px*540px的基座,并為其添加圖層樣式。3.接下來繼續使用圓角矩形工具,畫一個390px*390px圓角半徑為90px的形狀,命名為Bas浮雕水印怎么使用?1.雙擊桌面打開PS。2.使用快捷鍵ctrl n完成畫布命名等...