邻位互换生成全排列算法

/**
	本算法的思想也是希望以(12…n)作为n个元素1,2,…,n的第一个排列,
	然后按照某种方法,由一个排列(p)=(p1p2…pn)直接生成下一个排列,
	直到全部排列生成完毕为止。
	
	以n=4为例,开始在排列1234的各数上方加一个左箭头“←”,
	当一个数上方箭头所指的一侧,相邻的数比该数小时,便称该数处于活动状态。


	从排列(p)=(p1p2…pn)生成下一个排列的算法如下:
	(1)若排列(p)=(p1p2…pn)中无一数处于活动状态,则停止,否则转(2);
	(2)求所有处于活动状态的数中的最大者,设为k,
		k和它的箭头所指的一侧的相邻数互换位置,转(3);
	(3)令比k大的所有数的箭头改变方向,转(1)。


*/
#include <iostream>


using namespace std;


enum DIR{LEFT=-1,RIGHT=1};


/*	函数功能:判断下标i所指p中元素是否处于活动状态
 *	输入参数:p	in,指向n个字符的一个当前排列
 *			dir	in,标记p中每个元素的箭头方向
 *			i	in,待判定元素的下标
 *			N	in,待排列字符的个数
 *	返回值:	true 表示待判定元素为活动状态,
 *			false 表示待判定元素处于非活动状态
 */
boo
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值