2 解答模板
3 例題
顯而易見,這個演算法和深度優先遍歷有著緊密的聯絡,都是「一走走到頭,走到頭就回身到下乙個岔路口繼續走到頭」的型別。但不同於dfs的是需要有乙個「狀態重置」的操作,因為每一次「走到頭」都對應到了乙個解,返回時若沒有狀態重置就相當於又一次重複,且丟失了解空間的其他解。
回溯 = dfs + 狀態重置 (+ 剪枝)
void
backtrack
(track ,allchoise)
for(i : allchoise)
}
根據解答模板,我們可以將以下回溯法的經典例題套進去,來看一下回溯的威力。
class
solution
void
dfs(vector<
int>
& nums, vector<
int> result, vectorint>>
& ret,
int begin,
int end)
for(
int i = begin; i < end; i++)}
void
swap
(int
& a,
int& b)
};
#include
#include
using
namespace std;
vector> ans;
//儲存n皇后的解
bool
isok
(vector<
int>
& record,
int row)
//record[row]就是col
}return
true;}
void
findqueue
(int row,
int n, vector
&temp, vector<
int>
& record)
for(
int col =
0; col < n; col++)}
}vector>
solvenqueens
(int n)
vector
temp
(n, s)
;//初始化為全是.的nxn的二維陣列
findqueue(0
, n, temp, record)
;//findqueue
return ans;
}int
main()
bool
isvalidpart
(char
**board,
int i,
int j,
int*a)
return
true;}
bool
isvalidsudoku
(char
** board,
int boardrowsize,
int boardcolsize)
;//標記一行
int b[9]
=;//標記一列
int c[9]
[9]=
;//c[i]標記乙個9宮格
for(
int i =
0; i <
9; i++)}
return
true
;}
演算法之五大查詢演算法
五大經典查詢演算法 線性查詢,通過 遍歷,乙個乙個比較 核心演算法 順序查詢 public static int orderlookup int list,int key return 1 折半查詢 只能用於有順序的陣列 將需要查詢的數與陣列的中值進行比較,若小於,right指標左移,大於則右移,每...
演算法 五大演算法之貪心法
貪心法 greedy algorithm 又稱貪心演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。1.基本概念 貪心演算法與動態規劃的不同在於它每對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會儲存以前的運算結果,並根據以前的...
五大演算法之貪心演算法
貪心演算法是指對子問題取最值,從而求得區域性最優解,並以此求得全域性最優解。貪心演算法可以認為是動態規劃的乙個特例,同樣是需要將問題分解為子問題,避免了子問題的重複計算,只不過在子問題的處理上貪心演算法更加簡單直接。貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性,即某個狀...