日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 回溯法 子集树模板 系列 —— 1、8 皇后问题

發布時間:2023/12/10 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 回溯法 子集树模板 系列 —— 1、8 皇后问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題

8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處于同一行、同一列或同一斜線上,問有多少種擺法。

分析

為了簡化問題,考慮到8個皇后不同行,則每一行放置一個皇后,每一行的皇后可以放置于第0、1、2、...、7列,我們認為每一行的皇后有8種狀態。那么,我們只要套用子集樹模板,從第0行開始,自上而下,對每一行的皇后,遍歷它的8個狀態即可。

代碼

''' 8皇后問題 '''n = 8 x = [] # 一個解(n元數組) X = [] # 一組解# 沖突檢測:判斷 x[k] 是否與前 x[0~k-1] 沖突 def conflict(k):global xfor i in range(k): # 遍歷前 x[0~k-1]if x[i]==x[k] or abs(x[i]-x[k])==abs(i-k): # 判斷是否與 x[k] 沖突return Truereturn False# 套用子集樹模板 def queens(k): # 到達第k行global n, x, Xif k >= n: # 超出最底行#print(x)X.append(x[:]) # 保存(一個解),注意x[:]else:for i in range(n): # 遍歷第 0~n-1 列(即n個狀態)x.append(i) # 皇后置于第i列,入棧if not conflict(k): # 剪枝queens(k+1)x.pop() # 回溯,出棧# 解的可視化(根據一個解x,復原棋盤。'X'表示皇后) def show(x):global nfor i in range(n):print('. ' * (x[i]) + 'X ' + '. '*(n-x[i]-1))# 測試 queens(0) # 從第0行開始print(X[-1], '\n') show(X[-1])

效果圖

本文轉自羅兵博客園博客,原文鏈接:http://www.cnblogs.com/hhh5460/p/6919204.html,如需轉載請自行聯系原作者

總結

以上是生活随笔為你收集整理的python 回溯法 子集树模板 系列 —— 1、8 皇后问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。