回溯演算法問題

2021-10-03 16:32:27 字數 2191 閱讀 9827

回溯問題,其實就是乙個決策樹遍歷。

要考慮三個問題。

其實回溯問題可以理解為動規的暴力解法,而且是沒有重疊子問題的動規。

result =

public

void

backtrack

(路徑, 選擇列表)

:if 滿足結束條件

result.

add(路徑)

;return

;for 選擇 in 選擇列表

(排除不合法選擇)

做選擇backtrack

(路徑, 選擇列表)

; 撤銷選擇

給出n個數或字元,寫出全部可能的排列組合。

理解為第i位上的字母和自己及其後面的位置上字母進行交換。

回溯就是在遞迴前做出選擇,在遞迴後撤銷之前的選擇。

leetcode46題是無重複的陣列,**如下。

47題是有重複的陣列,需要進行進一步剪枝。

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)

n*n的棋盤,放n個皇后,讓它們不能相互攻擊。

注:皇后可以攻擊同一行、同一列、左上左下右上右下四個方向。(理解為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 判斷當前點能否...