深度搜尋入門題n皇后問題
問題描述:
要在n*n的西洋棋棋盤中放n個皇后,使任意兩個皇后都不能互相吃掉。規則是皇后能吃掉同一行、同一列、同一對角線的棋子。(即不能放置在有被吃危險的位置)
input:乙個整數n
ouput:q種放置方法下每種方法所對應n個皇后的具體座標和q的值
sample input:1
sample output:<1,1> 1
先貼一下**,再**思路。
#include
#include
#include
#include
#include
using
namespace std;
int n,i;
//n記錄是多少個皇后的問題,i記錄的是第幾個皇后
int a[
501]
;//陣列下標表示行號,陣列值表示列號
int sum;
//記錄有多少種解法
bool
judge
(int a,
int n)
//檢測當前位置的皇后是否是合法的
return
true;}
void
print_ans()
void
solve
(int i)
for(
int j=
1;j<=n;j++)}
}int
main()
思路概括:分為三個大模組
1:判斷模組:判斷皇后當前所在位置是否滿足條件,即不與任意皇后在同一列、同一行、同一對角線的相鄰位置。對於對角線問題的限制可以用abs()函式進行左對角和右對角的簡化。
2:深搜模組:當前位置滿足條件時,繼續遞迴,進行深度搜尋(dfs)。
3:列印模組:對於每一種解法,我們要將其輸出列印。
對**的一些額外注釋:
if
(abs
(a[j]
-a[n])==
abs(j-n)
|| a[j]
==a[n]
)/*陣列a下標代表橫座標(行),陣列a的值代表縱座標(列)
j+a[j] == n +a[n] (斜向正方向)j-a[j] == n -a[n] (斜向反方向)
加絕對值可以合併為正文**所示。*/
if
(i>n)
{//遞迴出口,每出現一次,意味著得到了一種解
sum++
;//當i=n代表一次完整的遞迴結束,故當i>n即可表示出現一種解,sum+1
另外:因為本題的搜尋方式是每一行求乙個皇后的位置,所以同一行不會有衝突,不需要考慮。
關於深搜還是有很多不懂的地方,遞迴也是本週剛剛搞懂一點皮毛,**也有不完美的地方,如何在短時間內用部落格的形式把頭腦的東西表達出來也是乙個難題。
N皇后問題(搜尋)
problem description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如...
回溯入門題 N皇后問題詳解
class solution 引數 路徑,選擇列表 public void backtrack int board,int row int n board row length 本行的列數 for int col 0 col n col board row col 1 backtrack board...
深度優先搜尋 HDU 2553 N皇后問題
今天的主菜是搜尋,想起來初中就聽過八皇后問題了啊。當年有乙個學程式設計的機會在我眼前我沒有去珍惜,到現在我只能默默後悔。嘛,其實我也沒那麼在意啦 皇后的移動方式是直線和斜線不限長移動,畢竟最強兵種。所以每一行必然只有乙個皇后,因此我們可以選擇以每行為單位來進行dfs 深度優先搜尋 然後是豎向和斜向,...