演算法經典搜尋問題 八皇后

2021-09-28 14:41:46 字數 1386 閱讀 4323

在介紹八皇后問題之前我們先說說dfs吧

咱們先來看看我的dfs入坑題:指數型列舉

#include

using

namespace std;

int n;

void

dfs(

int k,

int choose)

puts(""

);return;}

dfs(k+

1,choose)

;//不選

dfs(k+

1,choose|(1

intmain()

//輸入:3

//輸出:

//3

//2

//2 3

//1

//1 3

//1 2

//1 2 3

這道題比較經典,可以看出dfs讓我們能暴力列舉了所有的決策(選或者不選),如果你能理解這題那麼恭喜你,你dfs入門了。在資料量較小時暴力dfs無疑時非常優秀的選擇。好下面我們直接給出八皇后問題的**。

#include

using

namespace std;

int queen[8]

[8];

//當然也可以用二進位制表示但可能比較複雜,咱們就不自己難為自己了

int res=0;

void

copy

(int a[8]

[8],

int b[8]

[8])

void

work

(int a,

int b)

//選中a行b列

//最後

d=a+b;

i=a+b,j=0;

while

(i>=

0&&j<8)

}void

dfs(

int k)

int i=k;

int g[8]

[8];

//工具人放函式裡面不容易錯還舒服一點

copy

(g,queen)

;for

(int j=

0;j<

8;j++)}

}int

main()

八皇后問題時道非常經典的dfs問題,與上題類似我們列舉所有決策就可以了,與之不同的是我們很容易分析出每行(列)有且只有乙個皇后,與之不符就一定不行,在此基礎上dfs能太高不少的效率。其實這個方法也可以叫剪枝,但不是我們今天討論的重點。

我們模擬決策之後,就可以寫**了,別忘了工具人陣列一定要放在函式裡面,還有就是對角線一定要注意,注意好這幾點,想必大家很容易就能把此題解出來了。=。=

回溯法 經典n皇后問題

太懶了直接搬了 演算法框架 迭代版int a n i 初始化a n i 1 while i 0 有路可走 and 未達到目標 還沒有回溯到頭 else if a i 在搜尋空間內 else 遞迴版 int a n try int i 例如hdoj的2553就是經典回溯法 ac 注意要打表不然會tle...

經典演算法之八皇后問題

問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。下面利用回溯法 遞迴寫法 來求出所有可能的結果 include include include in...

經典回溯演算法 八皇后問題

八皇后問題是由19世紀數學家 搞死先生 高斯先生 提出的,具體的問題是這樣的 在西洋棋的棋盤中 有8 8格 擺放 8個皇后,這八個皇后不能相互攻擊到 皇后的攻擊方向很廣 橫著,豎著,斜著都能攻擊 即 8個皇后不能處於同行 同列 同一正反對角線上,這樣就不能相互攻擊到了。那麼,這樣的皇后佔位的方法,一...