有n排数字(同一横排的数字是互斥的,每次只能选择其中一个)。需要列举出分别选择1排,2排...n排的所有组合。横排和竖排的大小不确定,JS自适应处理,想了很久没弄出来,请教高手,十分感谢!
————
举例如:
1排 a1 a2
2排 b1 b2
3排 c1
...
n排 ......
,那么列举出的所有组合类似这样:[a1][a2][b1][b2][c1][a1 b1][a1 b2][a1 c1][b1 c1][b2 c1][a2 b1][a2 b2][a2 c1][a1 b1 c1][a1 b2 c1][a2 b1 c1][a2 b2 c1] ...
JavaScript排列组合
————
举例如:
1排 a1 a2
2排 b1 b2
3排 c1
...
n排 ......
,那么列举出的所有组合类似这样:[a1][a2][b1][b2][c1][a1 b1][a1 b2][a1 c1][b1 c1][b2 c1][a2 b1][a2 b2][a2 c1][a1 b1 c1][a1 b2 c1][a2 b1 c1][a2 b2 c1] ...
JavaScript排列组合
<body>
<script type="text/javascript">
var a=[['a1','a2'],['b1','b2'],['c1']];
var b={c:[],d:[],e:[]};
var n=0;
for(var i=0,al=a.length;i<al;i++){
n+=a[i].length;
}
for(var i=0,j=0,k=0;i<n;i++){
b.d[i]=k;
b.e[i]=a[k][j];
if(++j==a[k].length){
j=0;
k++;
}
}
LOOP:
for(var i=0,p=0;;i++){
for(var j=0;j<p;j++){
if(i==j){
continue;
}
if(b.d[b.c[j]]==b.d[i]){
continue LOOP;
}
}
b.c[p++]=i;
for(var j=0;j<p;j++){
document.write(b.e[b.c[j]]+",");
}
document.write('<br>');
if(i==n-1){
if(p==1){
break;
}
p-=2;
i=b.c[p];
}
}
</script>
</body>
</html>没写注释,先看看吧
var r = [];for(i=0; i<a.length; i++) {
len = r.length;
for(v in a[i]) r.push([a[i][v]]);
for(j=0; j<len; j++) {
for(v in a[i])
r.push(r[j].concat(a[i][v]));
}
}
[["a1"],["a2"],["b1"],["b2"],["a1","b1"],["a1","b2"],["a2","b1"],["a2","b2"],["c1"],["a1","c1"],["a2","c1"],["b1","c1"],["b2","c1"],["a1","b1","c1"],["a1","b2","c1"],["a2","b1","c1"],["a2","b2","c1"]] 必要的话,你就再按子数组长度排个序r.sort(function(a, b){ return a.length-b.length;});
[["a1"],["a2"],["b1"],["b2"],["c1"],["a1","b1"],["a1","b2"],["a2","b1"],["a2","b2"],["a1","c1"],["a2","c1"],["b1","c1"],["b2","c1"],["a1","b1","c1"],["a1","b2","c1"],["a2","b1","c1"],["a2","b2","c1"]]
我的有问题,现纠正好了,也是一种思路:
<html>
<body>
<script type="text/javascript">
var a=[['a1','a2'],['b1','b2'],['c1']];
var b={c:[],d:[],e:[]};
var n=0;
for(var i=0,al=a.length;i<al;i++){
n+=a[i].length;
}
for(var i=0,j=0,k=0;i<n;i++){
b.d[i]=k;
b.e[i]=a[k][j];
if(++j==a[k].length){
j=0;
k++;
}
}
for(var i=0,f=0,p=0;;i++,f=0){
b.c[p++]=i;
for(var j=0;j<p-1;j++){
if(b.d[b.c[j]]==b.d[b.c[j+1]]){
f=1;
break;
}
}
if(!f){
for(var j=0;j<p;j++){
document.write(b.e[b.c[j]]+",");
}
document.write('<br>');
}
if(i==n-1){
if(p==1){
break;
}
p-=2;
i=b.c[p];
}
}
</script>
</body>
</html>
len = r.length;
for(v in a[i]) r.push([a[i][v]]);//将每个子数组成员抄写进结果数组
for(j=0; j<len; j++) { //遍历结果数组,注意终止条件,新加入的成员是不参与的
for(v in a[i])
r.push(r[j].concat(a[i][v])); //将子数组的成员与结果数组的成员合成一个数组,并保存
}
}
r 与a[2]遍历的组合 的r
r 与a[n]遍历的组合 的r