回溯法也稱試探法,用於尋找乙個問題的可行解。該方法首先暫時泛起問題規模大小的閒置,從最小規模開始將問題的候選解按某種順序逐一列舉和檢驗,選擇乙個可行的候選解,然後擴大規模,繼續試探。打到要求的規模時,所有的候選解就形成了問題的可行解。8皇后和n皇后的問題就是基於回溯法解決的。
題目要求:在乙個8*8的棋盤上放置 8 個皇后,使8個皇后中沒有兩個或兩個以上的皇后會出現在同一行、同一列、或同一對角線上。
一、解決思路:
1.先簡單表示出我們想要的偽**。
queen_all (k) //k是這次放置皇后的所在列,如果k=1,那就是第一列。
}
2.針對這個偽**,我們要解決如下問題:
a. 對於①、②問題,我們先要找到一種方式來儲存可行解,當然我們也可以用二維陣列來模擬棋盤,每放置乙個皇后就把這位置標記下來,並把所在行列斜線都標記為false,再進行下一次放置皇后時,根據該行該列是否是 false 來放置。但自習思考這樣會造成標記和輸出上的麻煩。為了使問題便於思考和簡化**,我們可以採取以下方法。
b. 對於③,但迴圈 i=9 時自然會退出回溯到上一次放置皇后,不過我們要額外加一條**來取消上一次的標記。對於④也是同理。
c. 當我們把所有能夠試探的方法試探玩後,k=9,自然就會退出遞迴。
一切都思考清楚後就可以釋放**了,好耶!
二、**實現
void queen_all(int k) //開始傳遞數字'1',陣列開全域性
,times=0; //用times來記錄一共多少種結果
bool row[100]=,digleft[100]=,digright[100]=;
int main()
{ int n=0;
cin>>n;
queen_all(1,n);
cout《八皇后能幫助我們能夠理解回溯法的思想,是一次不錯的訓練。
感覺皇后問題比快排和搜尋簡單。
學習自:**c++程式設計**|思想與方法(我的教材)
八皇后(深搜)
八皇后 總時間限制 1000ms 記憶體限制 65536kb 描述 會下西洋棋的人都很清楚 皇后可以在橫 豎 斜線上不限步數地吃掉其他棋子。如何將8個皇后放在棋盤上 有8 8個方格 使它們誰也不能被吃掉!這就是著名的八皇后問題。對於某個滿足要求的8皇后的擺放方法,定義乙個皇后串a與之對應,即a b1...
深搜 N皇后問題
n皇后問題 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u submit status description 在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在...
八皇后 簡單深搜
檢查乙個如下的6 x 6的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第i個數字表示在第i行的相應位置有乙個棋子,如下 行號 1 2 3 4 5 6 列號 2 4 6 1...