回溯法模板秒殺八皇后 全排列,組合 子集問題

2021-10-07 13:20:16 字數 1907 閱讀 5347

回溯法模板:

result = 

def backtrack(路徑, 選擇列表):#這裡的路徑也就是初試根節點,選擇列表是初始化列表

if 滿足結束條件:

result.add(路徑)

return

for 選擇 in 選擇列表:#這裡選擇是可能的所有節點

做選擇 #把節點放入選擇列表中

backtrack(路徑, 選擇列表) #像下一級節點(決策樹)搜尋

撤銷選擇 #通常這裡的操作跟做選擇相反

全排列:

list> res = new linkedlist<>();

/* 主函式,輸入一組不重複的數字,返回它們的全排列 */

list> permute(int nums)

// 路徑:記錄在 track 中

// 選擇列表:nums 中不存在於 track 的那些元素

// 結束條件:nums 中的元素全都在 track **現

void backtrack(int nums, linkedlisttrack)

for (int i = 0; i < nums.length; i++)

}

n皇后:

vector> res;

/* 輸入棋盤邊長 n,返回所有合法的放置 */

vector> solvenqueens(int n)

// 路徑:board 中小於 row 的那些行都已經成功放置了皇后

// 選擇列表:第 row 行的所有列都是放置皇后的選擇

// 結束條件:row 超過 board 的最後一行

void backtrack(vector& board, int row)

int n = board[row].size();

for (int col = 0; col < n; col++)

}/* 是否可以在 board[row][col] 放置皇后? */

bool isvalid(vector& board, int row, int col)

// 檢查右上方是否有皇后互相衝突

for (int i = row - 1, j = col + 1;

i >= 0 && j < n; i--, j++)

// 檢查左上方是否有皇后互相衝突

for (int i = row - 1, j = col - 1;

i >= 0 && j >= 0; i--, j--)

return true;

}

leetcode77-組合:

class solution:

def combine(self, n: int, k: int) -> list[list[int]]:

def backtrack(first = 1, curr = ):

# if the combination is done

if len(curr) == k:

#output在記憶體中也會改變。而curr[:]則是先將curr完全複製

#再賦值給output。後面curr的改變不再影響output

for i in range(first, n + 1):

# add i into the current combination

# use next integers to complete the combination

backtrack(i + 1, curr)

# backtrack

curr.pop()

output =

backtrack()

return output

排列組合(遍歷)回溯法

這裡有乙個回溯函式,使用第乙個整數的索引作為引數 backtrack first 1,如果第乙個整數有索引 n,意味著當前排列已完成。2,遍歷索引 first 到索引 n 1 的所有整數 則 在排列中放置第 i 個整數,即 swap nums first nums i 繼續生成從第 i 個整數開始的...

演算法內功修煉 全排列實現八皇后回溯法優化(二)

3 全排列實現八皇后回溯法優化 樸素演算法 暴力法 通過列舉所有情況,然後判斷每一種情況是否合法的做法是非常樸素的 因此,我們把這種不使用優化,直接用樸素演算法來解決問題的做法叫做暴力法。回溯法 經過思考可以發現,當已經放置了一部分皇后時 程式執行到一定時 可能剩餘的皇后無論如何放置都無法滿足結果,...

模板 回溯法 (八皇后 素數環題解)

1.用約束函式在擴充套件結點處減去不滿足約束的子樹。2.用限界函式剪去得不到最優解的子樹。偽 模板 void dfs int t t記錄遞迴深度 void dfs int t 在dfs 1 以前,需要先將變數陣列x初始化為單位排列 1,2,3,void dfs int t 描述 在n n的方格棋盤放...