深度優先搜尋每一次搜尋都要走到底的(從左到右遍歷, 每一次遍歷從上到下遍歷完), 深度優先搜尋主要用遞迴實現, 因此也很容易超時.
回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
既然看到了回溯, 就順便講講回溯的典型題目(典型中的典型)。
八皇后問題:
題目描述:在西洋棋棋盤上放置八個皇后,皇后可以在橫、豎、斜線上不限步數地吃掉其他棋子。要求每兩個皇后之間不能直接吃掉對方。
按給定順序和格式輸出所有八皇后問題的解。
樣例 :
no. 1
1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 1 0 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 0 1 0 0
0 0 1 0 0 0 0 0
省略…思路:用乙個一維陣列儲存每個皇后的座標(如:a[3
]a[3]
a[3]
= 55
5表示有乙個皇后在三行五列)再列舉每乙個皇后的位置。
如果是單純的暴力列舉, 時間複雜度到了百億的級別, 是非常恐怖的。但是其中有很多是可以優化的, 比如不能再同一行列, 就優化到了十六萬左右。
但是不能處於同一對角線有一點棘手,怎麼辦呢?我們列乙個表, 記錄行列的差值01
2345
6781
0123
4567
2-101
2345
63-2-101
2345
4-3-2-101
2345
-4-3
-2-101
236-5
-4-3
-2-101
27-6-5
-4-3
-2-101
8-7-6-5
-4-3
-2-1
0不難發現, 只要兩個位置的行列之差相同, 他們就處於同一對角線。
另一條對角線也是同理(行列之和)01
2345
6781
2345
6789
2345
6789
10345
6789
101145
6789
1011125
6789
1011
121367
891011
1213147
891011
1213
141589
1011
1213
1415
16只要兩個位置的行列之和相同, 他們就處於同一對角線。
具體**如下
#include const int maxn = 8;
int n, x;
int a[100], cnt = 0;
bool l[100], d1[100], d2[100];
void dfs(long long h)
for(int i = 1; i <= maxn; i++)
}}int main()
深度優先搜尋演算法(DFS)
1.深度優先搜尋屬於圖的遍歷演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次。2.搜尋策略 深度優先遍歷圖的方法是,從圖中某頂點v出發 1 訪問頂點v 2 依次從v的未被訪問的鄰接點出發,對圖進...
DFS深度優先搜尋演算法
例題一 題目大意 約翰的農場被暴風雨給淹沒了,損失很大,他的保險公司將支付給他,但是支付金額取決於被淹沒的最大面積。這個農場是乙個邊長分別為n m的矩形,包含nm個空間,每個空間要麼是幹的,要麼是被淹沒的,一共有k個空間被淹沒。求最大的淹沒面積。ac include include include ...
DFS 深度優先搜尋演算法
深度優先搜尋演算法 depth first search,簡稱dfs 一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜尋將回溯到發現節點v的那條邊的起始節點。整個程序反覆進行直到所有節點都被訪問為止。屬於盲...