原理如图:

算法如下:
private function compoud(N:uint, C:uint):void
{
var pickIndex:int = 0;
var X:int=1;
var Y:int=1;
var P:int=1;
var i:int=0;
var arr:Array = new Array();
var src:Array = new Array();
for(i=0;i<N;i++)
{
src.push(i+1);
}
while(true)
{
if(pickIndex<N)
{
arr.push(src[pickIndex++]);
if(arr.length==C)
{
var tmp:String = "";
for(i=0;i<C;i++)
{
tmp +=arr[i]+ " ";
}
trace(tmp);
if(pickIndex==N)
{
var backto:int =-1;
for(i=C-1;i>0;i--)
{
if(arr[i]-arr[i-1]>1)
{
backto = i-1;
break;
}
}
if(backto==-1)
{
break;
}
pickIndex = arr[backto];
for(i=0;i<C-backto;i++)
{
arr.pop();
}
}
else
{
arr.pop();
}
}
}
else
{
break;
}
}
}

本文介绍了一种算法,用于生成长度为N的序列,并从中选取C个元素组成子序列,通过循环操作确保序列中任意两个相邻元素之差不超过1。在完成C个元素的选择后,如果序列达到终点,算法会尝试将最后一个元素回溯到前一个位置,重新选择不同的元素以满足条件。
2496

被折叠的 条评论
为什么被折叠?



