回溯演算法實際上是乙個類似於列舉的搜尋嘗試過程,主要在搜尋嘗試過程中尋找問題的解。當發現不滿足求解條件時,就「回溯」返回,嘗試別的路徑。
回溯可以理解為迷宮圖裡面去找出口,假如這條路走不通,就回到上乙個路口,選擇另外一條路來尋找出口;
int
search
(int k)}}
}
在8×8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法?
輸出:順序和每一種擺法;
第一步:首先放置第乙個皇后(用數字0來表示),同時他的行,列,和斜線上都被標記;01
1111
1111
1111
1111
1111
0111
1111
1121
1111
1111
1111
1111
1111
1111
1110
1111
1111
1211
1111
1113
1111
4111
1111
1151
1111
1111
1111
1111
1111
1111
111(這種情況下就放置到第五個皇后的時候,空間就放置完了,這個時候就需要回溯到放置第四個皇后的情況)01
1111
1111
2111
1111
1131
1114
1111
1111
111(5)11
1111
1111
1111
111(換下乙個位置來放置第五個皇后)
一直遞迴到直到放置下8個皇后,然後次數加1。
(1)首先通過題目考慮需要的變數:
乙個變數來表示已放置的皇后數,乙個變數來記錄順序數,同時乙個二維陣列來記錄圖,乙個陣列來記錄列,另外還需要兩個陣列來分別記錄兩條對角線
(2)其次構造三個函式
乙個用來搜尋放置,乙個來輸出,乙個main函式;
#include
#include
int num=0;
//順序數
int map[10]
[10];
//棋盤圖
int b[10]
,c[20
],d[20]
;//三個陣列,用來記錄列
//和兩條對角線
void
print
(int n)
}//輸出
void
search
(int i,
int n)
//假如已經放置完了八皇后,順序數+1,輸出,返回
for(
int j=
0;j}int
main()
回溯演算法實際上乙個類似列舉的搜尋嘗試過程;
回溯法屬於深度優先搜尋,由於是全域性搜尋,複雜度相對高;
回溯法在用來求問題的所有解時,要回溯到根,且根結點的所有子樹都已被搜尋遍才結束;
回溯法在用來求問題的任一解時,只要搜尋到問題的乙個解就可以結束;
回溯演算法說白了就是窮舉法,不過回溯演算法使用剪枝函式,剪去一些不可能到達 最終狀態(即答案狀態)的節點,從而減少狀態空間樹節點的生成。回溯法是乙個既帶有系統性又帶有跳躍性的的搜尋演算法;
回溯法適用於解一些組合數較大的問題,許多複雜的,規模較大的問題都可以使用回溯法。
我,眼中的詩歌
我,眼中的詩歌 給我一杯茶,乙個幽靜的地方,我好看些詩歌。寫前面 詩歌是一種態度。詩歌是燕子低低地飛過屋簷。詩歌是古代西方 盛行的決鬥。詩歌是人類本身一直都存在的 極為樸素的一種本能。詩歌和性別無關 和身材無關,和你曾看過多少書也沒有直接的 聯絡,造物主將嘴巴賦予人類的同時 也賦予了人類詩歌。詩歌是...
我眼中的委託
首先委託是乙個型別,和int string一樣,我們日常說的委託其實是委託型別的變數,委託的作用就是把方法當成引數來傳遞,將方法賦值給委託型別的變數,然後由這個變數去呼叫執行方法。換個方式,委託沒有具體實現體,因為委託就是叫別人去辦事,自己當然不需要實現了,但是委託別人必須要清楚自己想辦什麼事,這個...
我眼中的Spring MVC
spring mvc 是應用於web應用程式 mvc架構的 c 首先說一下spring mvc框架文件中的一句話 對擴充套件開放 對修改閉合 那麼特點就來了 高擴充套件性 這是它最大的特點還有 友好的設計的結構,思想,引數繫結,允許其他mvc的實現等等 總的來就是簡單易用 在這裡只是簡單介紹一下有哪...