全排列 递归方法(permutation原理
2024-10-06 15:24:50
https://blog.csdn.net/axiqia/article/details/50967863 原博客
(一)递归的全排列算法
(A、B、C、D)的全排列为
1、A后面跟(B、C、D)的全排列
2、B后面跟(A、C、D)的全排列(A与B交换,其他次序保持不变)
3、C后面跟(B、A、D)的全排列(A与C交换,其他次序保持不变)
4、D后面跟(B、C、A)的全排列(A与D交换,其他次序保持不变)
用数字举例方便点:
1234
1243
1324
1342
1432
1423
2134
....
3214
3214
3241
3124
3142
3412
3421
4231
为观察规律,仅仅标红1234全排列中最高位首次1,2,3,4的排列。
解释:
以1234为基础(代码中第二次交换的意义),同为第一层递归的4种状态分别为:
第一位和第一位交换(234==》1234);
第一位和第二位交换(34==》2134);
第一位和第三位交换(24==》3214);
第一位和第四位交换(23==》4123)。
为保证普遍性,选第三种状态继续递归:
以3214为基础,同为第二层递归的三种状态分别为:
第二位和第二位交换(314==》3214);
第二位和第三位交换(34==》3124);
第二位和第四位交换(31==》3412)。
继续递归即可。
#include <iostream>
#include <cstdio>
using namespace std; void permutation(int k, int n, int a[])
{
//递归到底层
if(k == n-)
{
for(int i = ; i < n; i ++)
printf("%d", a[i]);
printf("\n");
}
else
{
for(int i = k; i < n; i ++)
{
int temp = a[k];
a[k] = a[i];
a[i] = temp; //交换后递归下一层
permutation(k+, n, a); //保证每一层递归后保持上一层的顺序
temp = a[k];
a[k] = a[i];
a[i] = temp;
}
}
}
int main()
{
int a[];
int n;
scanf("%d", &n); for(int i = ; i < n; i ++)
a[i] = i+; permutation(, n, a);
return ;
}
不过输出的格式有点偏差
最新文章
- 【C#公共帮助类】分页逻辑处理类
- Mssql迁移至Oracle 查询优化
- flex acionscript png图片去除多余空白,生成合适大小图片
- coalesce函数用法
- Andriod Dialog 加载框 自定义,公用
- Codeforces Round #331 (Div. 2)
- Python补充03 Python内置函数清单
- 【C++基础】内存操作 getMemory改错
- 利用JQuery实现全选和反选的几种方法
- Embedded software develop step
- loj1370(欧拉函数+线段树)
- 【原创】poj ----- 2376 Cleaning Shifts 解题报告
- 在Magento产品页面的使用jqZoom
- JSON Schema 校验实例
- hdu3635
- 存储区域网络(Storage Area Network,简称SAN)
- static之静态初始化块
- 百度地图API密钥
- Jenkins和maven自动化构建java程序
- redis 连接超时。。
热门文章
- todolist形式的搜索框,分开组件写的,点击上下键时,框内显示当前选中的内容
- 分享一个关于Opencv的小总结
- 第一篇博客==>;Hello_World
- MySQL初始化脚本mysql_install_db使用简介及选项参数
- (生鲜项目)06. django的view实现商品列表页
- fastadmin 后台view data-source关联报500错误问题
- TCP 客户端编程
- JS的BOM操作语法
- docker安装详细步骤-centos7
- [官网]Windows 10 版本信息