<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文為介紹流行的數獨遊戲的系列文章中的第一篇。更具體地說,我們如何構建一個指令碼來解決數獨難題,本文的重點在於介紹用於構建數獨求解器的回溯演演算法。
數獨這個名字的由來來自日語短語suuji wa dokushin ni kagiru,意思是“數位必須保持單一”。數獨遊戲的流行也源於其規則的簡單性:數獨遊戲要求在 9 x 9 空間的網格上進行數位填寫。在行和列中有 9 個“正方形”的格子block(由 3 x 3 個子單元格cell組成)。每一行、每一列、每一個block都需要填寫數位 1-9,行、列、block內不得重複任何數位。
好的,知道了上述數獨的規則,那麼我們就來直接進入主體吧。 :)
這一步主要為使用一組數位來初始化我們的九宮格。我們使用setBoard() 函數將輸入轉換為適合我們後續操作的資料型別。我們使用以下約定:
這裡我們的輸入是一個多行字串,我們將其處理成二維列表的形式。樣例程式碼如下:
# Initialize a 2-D list with initial values described by the problem. # Returns board def setBoard(): board = list() sudokuBoard = ''' 200080300 060070084 030500209 000105408 000000000 402706000 301007040 720040060 004010003 ''' rows = sudokuBoard.split('n') for row in rows: column = list() for character in row: digit = int(character) column.append(digit) board.append(column) return board
上述程式碼執行後,如果展示在拼圖遊戲中,他的樣子大概如下:
函數findEmpty() 函數的操作更加簡單:對初始化後的九宮格作為引數傳遞,然後該遍歷該九宮格中每一個子單元格cell,直到找到返回的第一個空的子單元格。如果沒有找到空的子單元格,這表明我們的問題已解決,因此它返回None。
樣例程式碼如下:
# Find next empty space in Sudoku board and return dimensions def findEmpty(board): for row in range(9): for col in range(9): if board[row][col] == 0 : return row,col return None
函數isValid()的操作是確認設定的數位是否是九宮格子單元格的有效選項。為了使設定的值滿足數獨九宮格的要求,該值的設定需滿足以下條件:
如果我們設定的值滿足以上所有條件,該函數返回True,否則返回False。程式碼如下:
# Check whether a specific number can be used for specific dimensions def isValid(board, num, pos): row, col = pos # Check if all row elements include this number for j in range(9): if board[row][j] == num: return False # Check if all column elements include this number for i in range(9): if board[i][col] == num: return False # Check if the number is already included in the block rowBlockStart = 3* (row // 3) colBlockStart = 3* (col // 3) rowBlockEnd = rowBlockStart + 3 colBlockEnd = colBlockStart + 3 for i in range(rowBlockStart, rowBlockEnd): for j in range(colBlockStart, colBlockEnd): if board[i][j] == num: return False return True
以下是通過isValid() 函數中描述的條件後成功插入新值的動態範例:
同時,若我們引入一個與九宮格數獨上已經存在的值衝突的數值,那麼此時該值將不會被插入。圖例如下:
下一個函數是我們整個解決方案的核心思想,這裡引入了回溯思想,該演演算法的實現步驟如下:
# Solve Sudoku using backtracking def solve(board): blank = findEmpty(board) if not blank: return True else: row, col = blank for i in range(1,10): if isValid(board, i, blank): board[row][col] = i if solve(board): return True board[row][col] = 0 return False
由於遞迴理解起來不是那麼直觀,不妨讓我們嘗試使用動態來將整個過程形象化:
正如我們在上面的範例中看到的那樣,該演演算法用有效數位填充空子單元格cell,直到出現死衚衕;然後它回溯,直到重新迭代該過程。
上述我們的程式需要使用回溯演演算法來遍歷每個單元格的許多潛在值。這當然不是最優的解法,可以預想到我們的解決方法的效能會很慢。
我們使用上述程式碼,來解決尤拉計劃的第96題中的50道數獨題目,執行時間為:
The execution time of above program is : 23.56185507774353 s
好吧,確實有點慢。我們後面再來開篇講解數獨演演算法的優化。
本文講解了數獨遊戲的相關規則,以及如何在Python中利用回溯思想來一步一步解決數獨問題,並給出了完整的實現。
以上就是使用Python進行數獨求解詳解(一)的詳細內容,更多關於Python數獨求解的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45