Python 八皇后解法(非遞迴版本)
import Stack # 假設已經定義好棧類
def conflict(state, nextX):
'''判斷新皇后的落點是否與前一皇后衝突
1、如果新皇后與前一皇后在同一列,則 state[i] == nextX
2、如果新皇后與前一皇后在同一行,則 i == nextY
3、如果新皇后在前一皇后右對角線 ,則 nextX - state[i] == nextY - i
4、如果新皇后在前一皇后左對角線,則 state[i] - nextX == nextY - i
'''
nextY = len(state)
for i in range(nextY):
if abs(state[i] - nextX) in (0, nextY - i):
return True
return False
def queen(num = 8, state = ()):
st = Stack.Stack()
st.push([0,state]) # 每一個位置包含下一搜尋位置及相應的位置狀態資訊
while not st.is_empty():
now_queen = st.pop() # 從棧中彈出一個位置
for pos in range(now_queen[0], num):
temp_state = now_queen[1]
if not conflict(temp_state, pos):
if len(temp_state) == num - 1:
temp_state = temp_state + (pos,)
print (temp_state)
else:
now_queen[0] = pos + 1
st.push(now_queen)
next_queen = [0, temp_state + (pos,)]
st.push(next_queen)
相關文章
- 原:八皇后問題的遞迴和非遞迴Java實現遞迴Java
- 八皇后問題python解法Python
- 用棧+回溯+非遞迴解決N皇后問題遞迴
- python八皇后Python
- js使用遞迴回溯法解八皇后問題程式碼分享JS遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 每天刷個演算法題20160525:快速排序的遞迴轉非遞迴解法演算法排序遞迴
- python-動態規劃的遞迴、非遞迴實現Python動態規劃遞迴
- 每天刷個演算法題20160524:阿克曼函式的遞迴轉非遞迴解法演算法函式遞迴
- 資料結構 八皇后 c swift 版本資料結構Swift
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- 資料結構與演算法——歸併排序: 陣列&連結串列&遞迴&非遞迴解法全家桶資料結構演算法排序陣列遞迴
- 每天刷個演算法題20160523:騎士巡遊的遞迴轉非遞迴解法演算法遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- python實現二叉樹及其七種遍歷方式(遞迴+非遞迴)Python二叉樹遞迴
- 快速排序(遞迴及非遞迴演算法原始碼)排序遞迴演算法原始碼
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- C#中漢諾塔問題的遞迴解法C#遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- Vue3.0的遞迴監聽和非遞迴監聽Vue遞迴
- 八皇后||演算法演算法
- C#資料結構與演算法系列(十四):遞迴——八皇后問題(回溯演算法)C#資料結構演算法遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- 斐波那契數列的遞迴和非遞迴實現遞迴
- 漢諾塔非遞迴演算法遞迴演算法
- 漢諾塔非遞迴棧程式碼遞迴
- 資料結構-樹以及深度、廣度優先遍歷(遞迴和非遞迴,python實現)資料結構遞迴Python
- 洛谷八皇后問題
- 遞迴演算法轉換為非遞迴演算法的技巧遞迴演算法
- Java遍歷資料夾的兩種方法(非遞迴和遞迴)Java遞迴
- js深度繼承的非遞迴方法JS繼承遞迴
- 歸併排序的非遞迴實現排序遞迴
- 二叉樹非遞迴遍歷二叉樹遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 二分法的簡單實現——-遞迴和非遞迴遞迴