算法设计与分析——分支限界法——n皇后问题
一、問題描述
問題描述:在nn格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n皇后問題等價于在n*n的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。
算法設計:設計一個解n皇后問題的隊列式分支限界法,計算在nn個方格上放置彼此不受攻擊的n個皇后的一個放置方案。
*數據輸入:由文件input.txt給出輸入數據。第一行有1個正整數n。
*結果輸出:將計算的彼此不受攻擊的n個皇后的一個放置方案輸出到文件output.txt。文件的第一行是n個皇后的放置方案。
輸入文件:
input.txt
5
output.txt
1 3 5 2 4
二、問題分析
1.題目分析:
對于每一個放置點而言,它需要考慮四個方向上是否已經存在皇后。分別是行列,45度斜線和135度斜線。
行:每一行只放一個皇后,直到我們把最后一個皇后放到最后一行的合適位置,則算法結束。
列:列相同的約束條件,只需判斷j是否相等即可。
45度斜線和135度斜線:約束條件——當前棋子和已放置好的棋子不能存在行數差的絕對值等于列數差的絕對值的情況,若存在則說明兩個棋子在同一條斜線上
2.算法選擇:
用分支限界法來解決n皇后問題。對于該問題它滿足兩種樹結構。這里由于每一個合適的放置點出現最優解的概率是相等的,因此不需要使用優先隊列。編譯器提供了一個已經封裝好的隊列queue。
A.子集樹。我們把行約束條件和其它約束條件放在一起,即認為每一行,棋子都有n個位置可以放置。于是它的空間結構如下:
假設n=3,這個圖只畫出了兩層)
B.排列樹。我們把行約束條件單獨拿出來,也就是我們認為總共有八個皇后,這八個皇后必須都要放上去,但是放的位置不同,顯然這是一個排列樹。于是它的空間結構如下
這里由于我們還存在著其他的約束條件,并且行約束條件和這些條件完全可以放在一起,于是我就選擇了相對容易理解的子集樹作為解空間結構。
總結
以上是生活随笔為你收集整理的算法设计与分析——分支限界法——n皇后问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 灵犀语音助手app如何使用?灵犀语音助手
- 下一篇: RISC-V生态架构浅析(认识RISC-