c语言回溯法,回溯法 实现 排列组合(C 语言版本)
* 所谓回溯:就是搜索一棵状态树的过程,这个过程类似于图的深度优先
* 搜索(DFS),在搜索的每一步(这里的每一步对应搜索树的第i层)中
* 产生一个正确的解,然后在以后的每一步搜索过程中,都检查其前一步
* 的记录,并且它将有条件的选择以后的每一个搜索状态(即第i+1层的
* 状态节点)。
/*
* 回溯法 实现 排列组合
*
* 所谓回溯:就是搜索一棵状态树的过程,这个过程类似于图的深度优先
* 搜索(DFS),在搜索的每一步(这里的每一步对应搜索树的第i层)中
* 产生一个正确的解,然后在以后的每一步搜索过程中,都检查其前一步
* 的记录,并且它将有条件的选择以后的每一个搜索状态(即第i+1层的
* 状态节点)。
*
* 需掌握的基本算法:
* 排列:就是从n个元素中同时取r个元素的排列,记做P(n,r)。(当r=n时,
* 我们称P(n,n)=n!为全排列) 例如我们有集合OR = {1,2,3,4},那么
* n = |OR| = 4, 且规定r=3, 那么P(4,3)就是:
*
* {1,2,3}; {1,2,4}; {1,3,2}; {1,3,4}; {1,4,2}; {1,4,3};
* {2,1,3}; {2,1,4}; {2,3,1}; {2,3,4}; {2,4,1}; {2,4,3};
* {3,1,2}; {3,1,4}; {3,2,1}; {3,2,4}; {3,4,1}; {3,4,2};
* {4,1,2}; {4,1,3}; {4,2,1}; {4,2,3}; {4,3,1}; {4,3,2}
*
*/
#include
#ifndef MAXN
#define MAXN 5
#endif
static int n = 3, r = 3; /* P(n,r) */
static char used[MAXN]; /* 待排列数据使用标记 */
static char p[MAXN]; /* 解空间 - 保存每次形成的排列结果 */
static char data[] = {'a','b','c'}; /* 待排列组合的数据空间 */
/*
* permute(pos -- 表示在解空间中填写数据的下标位置)
* {
* 如果解空间填写满了 打印解空间当前的排列结果 函数返回
*
* for (i=0; i
* {
* 尝试在这个下标位置填写每一个待排列的数据
* (但这些数据可填写的前提是数据没有被标记为已使用)
*
* 填写后, 把这个下标为i的数据标记为已使用
*
* permute(pos+1); -- 填写解空间中下一个位置
*
* 下标为i的数据已参与了解空间下标pos处的排列
* 取消已使用标记(因为该数据可以在解空间其他下标处使用)
* 继续for循环考察下一个待排列数据
* }
* }
*
* used[i] == 1 - 待排列空间中下标i处的数据已被使用;
* used[i] == 0 - 可以使用待排列空间中下标i处的数据;
*/
void permute(int pos)
{
int i = 0;
if (pos == r)
{
for (i=0; i
printf("%c, ",p[i]);
printf(" ");
return;
}
for (i=0; i
{
if (!used[i])
{
used[i]++;
p[pos] = data[i];
permute(pos+1);
used[i]--;
}
}
}
void main() { permute(0); }
c语言回溯法,回溯法 实现 排列组合(C 语言版本)相关推荐
- 用c语言实现字母排列组合,C语言字母排列组合的实现.pdf
C语言字母排列组合的实现 曹玉坤 2011-6-21 目录 概述3 需求3 规律3 实现算法5 难点6 代码6 概述 本文档概述字母排列组合的实现算法和分析过程,着重强调在 解决问题前,对问题的思考方 ...
- 用c语言实现字母排列组合,C语言字母排列组合的实现.doc
C语言字母排列组合的实现.doc C语言字母排列组合的实现曹玉坤2011-6-21目录概述3需求3规律3实现算法5难点6代码6概述 本文档概述字母排列组合的实现算法和分析过程,着重强调在解决问题前,对 ...
- 三个字母排列组合c语言,n个球的排列组合算法
/*算法说明: 问题:现在有n个球,分别编号为1,2,3···n,对这n个球有多少种不重复的排列,列出所有的排列. 解:由数学知识可知:第一个球有n种选择,第二个球有n-1个选择··所以共有n!种选择 ...
- python排列组合问题_回溯问题Python框架总结——排列组合问题
本文是对leetcode回溯题的一些模板进行整理总结,很多关于回溯的blog都会引用对回溯算法的official definition和通用的解题步骤,如果是真的想研究这一算法思想,按照这样的方式来完 ...
- 排列组合 C语言实现
#include <stdio.h> #include <stdlib.h>int array[] = {1,2,3,4};#define N 4 #define M 3 in ...
- 4个字母的排列组合c语言,1,2,3,4四个数字有多少种排列组合,是怎样的
概述:本道作业题是明倮粤同学的课后练习,分享的知识点是怎么样才叫努力学习,指导老师为糜老师,涉及到的知识点涵盖:怎样努力才算努力? 作文-怎么样才叫努力学习,下面是明倮粤作业题的详细. 题目:怎样努力 ...
- c语言钻石字母图案,PS制作排列组合闪亮钻石文字图片
作者制作钻石字方法非常不错.过程:先选择一款小点字体,输入想要的文字并复制一层:然后给两层文字分别添加图层样式,底层文字主要做出钻石效果,副本图层用来渲染颜色和增加细节:最后添加一些星光笔刷装饰即可. ...
- 排列组合简介以及相关问题
排列组合问题 高中学过的知识,太久没用过了现在记录一下 排列组合问题 排列组合问题 初步了解:加法原理和乘法原理 排列组合 初识排列 定义 计算公式 初识组合 定义 公式 排列组合的三种技巧方法 1) ...
- LeetCode 例题精讲 | 08 排列组合问题:回溯法的候选集合
点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自面向大象编程 本期例题:LeetCode 46 - Permutations[1]( ...
最新文章
- zoj 3762(求三角形的最大高)
- IDEA 错误:找不到或无法加载主类
- IOC操作Bean管理XML方式(外部属性文件)
- Linux基本常用命令
- Oracle sqlplus使用总结
- 你不努力,就是你的错!
- 中国水培营养素行业市场供需与战略研究报告
- Audition去除音频中的人声保留背景音乐
- 云初起微方案中下单人、联系人、下载者三者之间是什么关系?
- 零基础CSS入门教程(29)–CSS下拉菜单实例
- flutter 报错 type ‘int‘ is not a subtype of type ‘String‘ 奇葩经历
- 陈莉君 linux内核,Linux内核分析与应用 西安邮电大学(陈莉君)
- 学会php又忘了,要学会忘记的说说,学会忘记一个人的说说
- HTML、CSS面试题
- 【探花交友DAY 08】左滑不喜欢右滑喜欢以及附近的人
- pycharm中使用chatgpt
- Installing OpenCV 2.4.9 in Ubuntu 14.04 LTS
- 了解阿博茨RPA生态系统
- Unity 使用NavMesh实现简易的摇杆功能
- 推荐一些硬核的公众号