在介紹八皇后問題之前我們先說說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個皇后不能處於同行 同列 同一正反對角線上,這樣就不能相互攻擊到了。那麼,這樣的皇后佔位的方法,一...