解决方案 »

  1.   

    是否如此?
    <script>
    var arr1=['a1','a1','a2'];
    var arr2=['b1','b1','b2'];
    alert(get(arr1,arr2));//[[a1,b1],[a1,b2],[a2,b1],[a2,b2]]

    function get(arr1,arr2)
    {
    var arr=[];

    if(arr1.length<arr2.length)
    {
    var o=arr1;
    arr1=arr2;
    arr2=o;
    }

    arr1=checkArr(arr1);
    arr2=checkArr(arr2);
    for(var i=0;i<arr1.length;i++)
    {
    for(var j=0;j<arr2.length;j++)
    {
    var temp=[];
    temp.push(arr1[i],arr2[j]);
    arr.push(temp);
    }
    }
    return arr;
    }
    function checkArr(arr)//数组去重
    {
    var json={};
    var temp=[];
    for(var i=0;i<arr.length;i++)
    {
    if(!json[arr[i]])
    {
    temp.push(arr[i]);
    json[arr[i]]=1;
    }
    }
    return temp;
    }
    </script>
      

  2.   

    var a=[['a1','a2'],['b1','b2','b3','b4'],['c1','c2','c3']];
    var r = [];
    var i =0;
    var a_len = a.length;for(; i<a_len; 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]));
        }
    }var f = [];
    i=0;
    for(;i<r.length;i++){
    if(r[i].length == a_len){
    f.push(r[i]);
    }
    }
    var $a = f;
      

  3.   

    出来只有3个元素的组合?小于列数的n个元素的组合没出来,且后面顺序是组合后面的c在变,不是a首先变,如正确的是
    a1 b1 c1
    a2 b1 c1 现在结果是
    a1 b1 c1
    a1 b1 c2
    a1 b1 c3这样它就变成了最右边的列组合最优先出现了,而不是最左边.
      

  4.   

    <script>
    var N = 4;
    var cnt = [4, 2, 5, 3];
    var temp = [0, 0, 0, 0];
    var label = ['a', 'b', 'c', 'd'];
    for (var size = N; size >= 1; --size)
    for (var mask = (1 << size) - 1; mask < 1 << N;)
    {
    var total = 1;
    for (var i = 0; i < N; ++i)
    if (mask & 1 << i)
    {
    temp[i] = total;
    total *= cnt[i];
    }
    for (var id = 0; id < total; ++id)
    {
    var s = "";
    for (var j = 0; j < N; ++j)
    if (mask & 1 << j)
    {
    var v = (id - id % temp[j]) / temp[j] % cnt[j];
    s = s + label[j];
    s = s + (v + 1) + " ";
    }
    s = s + "<br/>";
    document.write(s);
    }
    var x = mask & - mask;
    var y = mask + x;
    mask = ((mask & ~y) / x >> 1) | y;
    }
    </script>
      

  5.   

    不错,很强,
    测试了一下,结果是正确的,我正在把输入的数据结构改成var data =
    [
     ["A1",'A2']
    ,["B1","B2"]
    ,["C1","C2"]
    ];看来你也会js,
    我的输入数据如a1是一个数据来的,没有拆开a与1这样的存放,只是在看似行,列结构而已,担心一会我没搞明白,需要再请教你,一会再二个帖子结分给你.呵呵.
      

  6.   

    修改后的代码,感觉应该是正确的<script type="text/javascript">function com(data) {
    var N = data.length;//列个数
    var store = [];
        var temp = [];
        for (var size = N; size >= 1; --size)
        for (var mask = (1 << size) - 1; mask < 1 << N;)
        {
            var total = 1;
            for (var i = 0; i < N; ++i)
            if (mask & 1 << i)
            {
                temp[i] = total;
                total *= data[i].length;
            }
            for (var id = 0; id < total; ++id)
            {
                var s = [];
                for (var j = 0; j < N; ++j)
                if (mask & 1 << j)
                {
                    var v = (id - id % temp[j]) / temp[j] % data[j].length;
                    s.push(data[j][v]);
                }
                store.push(s);
            }
            var x = mask & - mask;
            var y = mask + x;
            mask = ((mask & ~y) / x >> 1) | y;
        } return store;
    }

    var data =
    [
     ["A1",'A2','A3']
    ,["B1","B2"]
    ,["C1","C2"]
    ,['d1']
    ,['e1','e2','e3']
    ];document.write(com(data).join('<br />'));</script>
      

  7.   

    算法1:
    给定集合,枚举元素个数为size的集合,主要是位操作上的技巧。算法2:
    在指定列的情况下,每个列选的元素的个数也知道,于是所有组合的个数是cnt[col[0]] * cnt[col[1]] ...
    其中col[i]是选择的第i列。
    换个角度思考,如果每个列的元素是10,那么每个组合和一个十进制数对应。
    每个列元素个数不一定是10,只是变了进制而已,每一位上的进制不同,于是用temp来表示对应位上的权。
    然后从小枚举所有的数,可以反向求出来每一位上的权,进而求出对应的元素。