全排列 .acm 1377

本文探讨了如何使用C++实现全排列算法,通过递归完成1到n数字的全排列输出。首先介绍了一个递归的例子,解释了递归过程中两次交换的作用,即形成新排列和还原排列以准备下一次交换。接着,提到了1377 ACM问题,指出对于以3开头的排列,需要从小到大输出全排列。此外,还指出全排列问题可以用for循环解决,并强调了正序输出的方法。
摘要由CSDN通过智能技术生成

某乎能粘贴表格,排版更好看
e.g. 1,2,3的全排列
k表示层数<角标>(从0到2,共三层)
K=0 1 2&1
Swap 1和1 1&1
K=1 2 知乎
Swap 2和2 2&2->for 3&2->out 2&3->swap
K=2 3
Swap 3&3
Out: 1,2,3->swap 1,3,2->swap
图例:递归一次先去确定第一位,然后深入挖掘到最后一层,输出一个排列,再返回上一层交换。
递归前后两次交换的意义:
第一次:
形成新的排列
第二次:
还原成最初的排列,为下一次的交换做准备。
逻辑:
按住前面不放,从最后开始一个一个进行交换

在这里插入图片描述
递归特点:每一层,k不变

/*#include<iostream>
#include<string>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{

}*/
#include<iostream>
using namespace std;
void swap(int& a, int& b)
{
   
	int t;
	t = a;
	a = b;
	b = t;
}
void process(int*list, int k, int m)
{
   
	if (k == m)
	{
   
		for (int i = 0; i <= m; i++)
			cout << list[i];
		cout << endl;
	}
	else {
   
		for (int i = k; i <= m; i++)
		{
   
			if (k == 0)cout << "第一层" << endl;
			swap(list[i], list[k]);
			process
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值