首先是题目描述:

给定一个没有重复数字的序列,返回其所有可能的全排列。

回溯算法是什么?回溯算法是系统搜索问题解集的一种方法,说白了就是一种搜索方法。回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。

回到题目上来,如果给出的序列是{1,2,3},使用三个for循环就能解决该问题,used是用来判断数据是否已经使用,学过图的遍历应该很好理解。

vectorused = {false, false, false};

for(int i = 1; i <= 3; i++){

used[i-1] = true;

for(int j = 1; j <= 3; j++){

if(!used[j-1]){

used[j-1] = true;

for(int k = 1; k <= 3; k++){

if(!used[k-1]){

used[k-1] = true;

cout << i << j << k << endl;

used[k-1] = false;

}

}

used[j-1] = false;

}

}

used[i-1] = false;

}

输出如下:

123

132

213

231

312

321

但如果序列有n个数据怎么办?还要使用n个for循环吗?答案是肯定不行,因此需要一个用来替换n个for循环的算法。模板如下:

void backtrack(int i,int n,other parameters)

{

if( i == n)

{

//get one answer

record answer;

return;

}

//下面的意思是求解空间第i个位置上的下一个解

for(next ans in position i of solution space)

{

backtrack(i+1,n,other parameters);

}

}

深度遍历,直到走不通或者找到一个解后,进行回溯,回到父节点上继续搜索

比如全排列中深度dep==n之后,该解是一个可行解,则回溯

回溯法:

void backtrack(vector& row,vector& used,vector& nums,int dep){

//dep为递归深度,用于记录在一行中那个位置插入,n为行数

if(dep==nums.size()){

per.push_back(row);

return;

}

for(int i=0;i> permute(vector& nums) {

vectorused(nums.size(),false); //记录nums该为是否被使用

vectorrow(nums.size()); //储存一行

backtrack(row,used,nums,0);

return per;

}

全排列回溯算法C语言,回溯算法(以全排列为例)相关推荐

  1. 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)

    C语言经典算法 - 老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下 ...

  2. 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

  3. bf算法c语言'',BF算法

    BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相 ...

  4. bfgs算法c语言,机器学习算法实现解析——liblbfgs之L-BFGS算法

    在博文"优化算法--拟牛顿法之L-BFGS算法"中,已经对L-BFGS的算法原理做了详细的介绍,本文主要就开源代码liblbfgs重新回顾L-BFGS的算法原理以及具体的实现过程, ...

  5. 四元数算法 c语言,四元数算法运算规则及基本概念

    [酷飞网 51kufei.com]上周,我们为大家介绍了求解求解无人机姿态角的各种算法,那么四元数算法基本的运算法则又是什么呢?今天,我们将为大家介绍四元数算法运算规则及基本概念. 大家知道,四元数可 ...

  6. apriori算法 c语言,数据挖掘算法——Apriori算法

    Apriori算法 首先,Apriori算法是关联规则挖掘中很基础也很经典的一个算法. 转载来自:链接:https://www.jianshu.com/p/26d61b83492e 所以做如下补充: ...

  7. 回溯与分支限界算法c语言,回溯与分支限界算法设计.docx

    算法设计与分析实验报告 专业 班级 姓名 学号 实验名称 实验四:回溯与分支限界算法设计 实验目的 掌握回溯法解决问题的一般步骤. 学会使用回溯法解决实际问题. 掌握分支限界法解决问题的基本思想. 学 ...

  8. 分支限界算法c语言_算法学习计划

    学习计划 根据王红梅编著的<算法设计与分析>,读取每一章的内容,然后从乐扣上找对应的算法题,包含简单-中等-困难三种程度.尽量每两周能够完成一章.遇到一种类型的问题时,先自己想想解决方案, ...

  9. 寻路算法c语言,C++算法之寻路算法

    寻路是游戏设计中需要使用到一种功能,那么我们怎么样以一个点作为起始点,快速地寻找到目标点呢?其实寻路的方法不难.一种简单有效的方法就是回溯法.如 果我们从一个点出发,那么这个点周围肯定有若干条路,只要 ...

最新文章

  1. 数学建模学习笔记——图论最短路径
  2. 【工具】git笔记(一)
  3. Python学习系列:PyCharm CE 安装与测试
  4. SCVMM 2012 R2运维管理九之:添加非信任的Hyper-v主机和群集
  5. 汇顶科技2021秋招笔试
  6. oracle使用关键字做表字段名_ArcGIS SQL使用
  7. 3种设计模式的java小程序,java实现的设计模式小程序 模拟Web系统
  8. vscode的sftp插件同步失败no such file的问题
  9. Python官方中文开发文档
  10. app接口制作简单流程
  11. 思科交换机配置远程登录命令
  12. 如何将bmp转化为jpg?
  13. iOS常见错误1-SQLite错误-SQLITE_CANTOPEN,SQLITE_MISUSE和SQLITE_BUSY
  14. 三天打鱼两天晒网C++
  15. 无限火力跳跳机器人_英雄联盟无限火力小拳拳升降机蒸汽机器人
  16. 技术人如何写好技术文档?
  17. 关系模式设计优化(数据库学习重点,难点)
  18. 中小型企业要抓住中产阶级消费带来的机会
  19. java经典问题:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
  20. 读《精通JavaScript+jQuery》笔记二

热门文章

  1. 单片机 并口 控制爱普生打印机开发流程记录
  2. css+js制作循环轮播图——可滑动
  3. 怎么取消苹果订阅自动续费?教你一招,2分钟搞定!
  4. 20万赚200万,48岁创业者是这样吊打小鲜肉的!
  5. 如何利用树莓派制作路由器
  6. 巴拿赫空间的基本性质
  7. python自然语言分析--倚天屠龙记人物关系、词云、柱状图、-词频
  8. vue +SpringBoot + FreeMarker + FlyingSaucer 实现PDF在线预览、打印、下载
  9. 以CS1237为例来看ADC芯片两个基本指标
  10. LiteIDE的sublime黑色 淡绿色 配色文件自定义版本