回溯問題,其實就是乙個決策樹遍歷。
要考慮三個問題。
其實回溯問題可以理解為動規的暴力解法,而且是沒有重疊子問題的動規。
給出n個數或字元,寫出全部可能的排列組合。result =
public
void
backtrack
(路徑, 選擇列表)
:if 滿足結束條件
result.
add(路徑)
;return
;for 選擇 in 選擇列表
(排除不合法選擇)
做選擇backtrack
(路徑, 選擇列表)
; 撤銷選擇
理解為第i位上的字母和自己及其後面的位置上字母進行交換。
回溯就是在遞迴前做出選擇,在遞迴後撤銷之前的選擇。
leetcode46題是無重複的陣列,**如下。
47題是有重複的陣列,需要進行進一步剪枝。
n*n的棋盤,放n個皇后,讓它們不能相互攻擊。public list
>
permute
(int
nums)
process
(nums,
0, lists,
newarraylist
());
return lists;
}public
void
process
(int
nums,
int i, list
> lists, list
list)
//其實可以不加這個判斷if(
!lists.
contains
(new
arraylist
<
>
(list)))
}for
(int j = i; j < nums.length; j++)}
public
void
swap
(int
nums,
int a,
int b)
注:皇后可以攻擊同一行、同一列、左上左下右上右下四個方向。(理解為8個方向上的車)
list
> ret =
newarraylist
<
>()
;public list
>
solvenqueens
(int n)
}process
(n,0
, chars )
;return ret;
}public
void
process
(int n,
int index,
char
chars )
ret.
add(list)
;return;}
for(
int col =
0; col < n; col++
) chars[index]
[col]
='q'
;process
(n, index +
1, chars)
; chars[index]
[col]
='.';}
}//檢查列,左上,右上,行有沒有q
public
boolean
isvaild
(int n,
char
chars,
int row,
int col)
}for
(int i =
0; i < col; i++)}
for(
int i = row -
1, j = col -
1; i >=
0&& j >=
0; i--
, j--)}
for(
int i = row -
1, j = col +
1; i >=
0&& j < n; i--
, j++)}
return
true
;}
裝載問題 回溯演算法
題目描述 有一批共n個貨櫃要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi。裝載問題要求確定,是否有乙個合理的裝載方案可將這n個貨櫃裝上這2艘輪船。如果有,找出一種裝載方案。題目出自 計算機演算法設計與分析 第三版 王曉東 這是乙個典型的回溯演算法問題。如下 template clas...
回溯演算法 裝載問題
給定n個貨櫃要裝上一艘載重量為c的輪船,其中貨櫃i的重量為wi。貨櫃裝載問題要求確定在不超過輪船載重量的前提下,將盡可能多的貨櫃裝上輪船 貪心演算法中的裝載問題討論的是裝載件數 本題討論的是最大裝載重量。由於貨櫃問題是從n個貨櫃裡選擇一部分貨櫃,假設解向量為x x1,x2,xn 其中xi xi 1表...
演算法 迷宮問題 回溯
package datastructure.migong public class test for int i 0 i 8 i map 3 1 1 map 3 2 1 map 3 3 1 setway map,1,1 for int i map system.out.println 判斷當前點能否...