全排列回溯算法C语言,回溯算法(以全排列为例)
首先是题目描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
回溯算法是什么?回溯算法是系统搜索问题解集的一种方法,说白了就是一种搜索方法。回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。
回到题目上来,如果给出的序列是{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语言,回溯算法(以全排列为例)相关推荐
- 老鼠走迷宫php算法,C语言经典算法 - 老鼠走迷官(一)
C语言经典算法 - 老鼠走迷官(一) 说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表 示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下 ...
- 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解
最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...
- bf算法c语言'',BF算法
BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相 ...
- bfgs算法c语言,机器学习算法实现解析——liblbfgs之L-BFGS算法
在博文"优化算法--拟牛顿法之L-BFGS算法"中,已经对L-BFGS的算法原理做了详细的介绍,本文主要就开源代码liblbfgs重新回顾L-BFGS的算法原理以及具体的实现过程, ...
- 四元数算法 c语言,四元数算法运算规则及基本概念
[酷飞网 51kufei.com]上周,我们为大家介绍了求解求解无人机姿态角的各种算法,那么四元数算法基本的运算法则又是什么呢?今天,我们将为大家介绍四元数算法运算规则及基本概念. 大家知道,四元数可 ...
- apriori算法 c语言,数据挖掘算法——Apriori算法
Apriori算法 首先,Apriori算法是关联规则挖掘中很基础也很经典的一个算法. 转载来自:链接:https://www.jianshu.com/p/26d61b83492e 所以做如下补充: ...
- 回溯与分支限界算法c语言,回溯与分支限界算法设计.docx
算法设计与分析实验报告 专业 班级 姓名 学号 实验名称 实验四:回溯与分支限界算法设计 实验目的 掌握回溯法解决问题的一般步骤. 学会使用回溯法解决实际问题. 掌握分支限界法解决问题的基本思想. 学 ...
- 分支限界算法c语言_算法学习计划
学习计划 根据王红梅编著的<算法设计与分析>,读取每一章的内容,然后从乐扣上找对应的算法题,包含简单-中等-困难三种程度.尽量每两周能够完成一章.遇到一种类型的问题时,先自己想想解决方案, ...
- 寻路算法c语言,C++算法之寻路算法
寻路是游戏设计中需要使用到一种功能,那么我们怎么样以一个点作为起始点,快速地寻找到目标点呢?其实寻路的方法不难.一种简单有效的方法就是回溯法.如 果我们从一个点出发,那么这个点周围肯定有若干条路,只要 ...
最新文章
- 数学建模学习笔记——图论最短路径
- 【工具】git笔记(一)
- Python学习系列:PyCharm CE 安装与测试
- SCVMM 2012 R2运维管理九之:添加非信任的Hyper-v主机和群集
- 汇顶科技2021秋招笔试
- oracle使用关键字做表字段名_ArcGIS SQL使用
- 3种设计模式的java小程序,java实现的设计模式小程序 模拟Web系统
- vscode的sftp插件同步失败no such file的问题
- Python官方中文开发文档
- app接口制作简单流程
- 思科交换机配置远程登录命令
- 如何将bmp转化为jpg?
- iOS常见错误1-SQLite错误-SQLITE_CANTOPEN,SQLITE_MISUSE和SQLITE_BUSY
- 三天打鱼两天晒网C++
- 无限火力跳跳机器人_英雄联盟无限火力小拳拳升降机蒸汽机器人
- 技术人如何写好技术文档?
- 关系模式设计优化(数据库学习重点,难点)
- 中小型企业要抓住中产阶级消费带来的机会
- java经典问题:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
- 读《精通JavaScript+jQuery》笔记二