追溯算法,穷
解决回溯问题实际上是决策树的扫描过程
路径:即已经选择
选择列表:是你现在可以选择的
终止条件:即到达决策树底部,不能再选择的条件。
回溯算法的一个特点是:它并不能优化为存在与动态规划重叠的部分问题。 回溯算法是纯暴力穷举,复杂度一般较高,不能低于0(n )。 因为,网罗整个决策树是不可避免的。
python代码:
from rich.console导入控制台
来自导入打印
控制台=控制台()
res=[]
efpermute(nums ) :
tarck=[]
回溯(nums,tarck ) )。
返回RES
德夫回溯(nums,track ) :
if (len (跟踪)==len (nums ) ) :
RES.append (跟踪.复制) )
console.log('nums长度与跟踪长度匹配(,style='bold red underline ) ) )
print ('当前res为:'str ) (res ) )
返回RES
for i in nums:
if i in track:
连续
途径.应用程序(I )。
回溯(nums,跟踪) )。
途径. pop (
RES=permute ([ 1,2,3 ]
console.log(RES,style='bold green ' ) )。
#输出结果: [ [ 1,2,3 ]、[ 1,3,2 ]、[ 2,1,3,1,1 ]、[ 3,3,2,2 ]、[ 3,3,2,2,2 ]
dart代码:
列表RES=[ ];
listpermute(listnums ) {
列表跟踪=[ ];
回溯(nums,track );
返回RES;
}
语音跟踪(列表,列表跟踪) {
if(nums.Length==track.Length ) {
RES.add (途径. sublist (0) );
print ('当前res为: ' res.toString ) );
返回;
}
for(intI=0; I
if (跟踪. contains (nums [ I ] ) ) }
继续;
}
途径. add (nums [ I ];
回溯(nums,track );
跟踪. remove last (;
}
}
void main () }
var xx=permute ([ 1,2,3 ];
打印(xx;
}
Flutter写的APP,源代码必须能够私信~~。