有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.   

    <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++;
    }
    }
    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>没写注释,先看看吧
      

  2.   

    var a=[['a1','a2'],['b1','b2'],['c1']];
    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"]] 
      

  3.   

    楼上版主的代码果然威武霸气。
    我的有问题,现纠正好了,也是一种思路:
    <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>
      

  4.   

    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])); //将子数组的成员与结果数组的成员合成一个数组,并保存
        }
    }
      

  5.   

    a[0]与a[1]遍历的组合    的r 
    r 与a[2]遍历的组合       的r
    r 与a[n]遍历的组合      的r