程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 變相進位制對不同長度的數組元素全組合

變相進位制對不同長度的數組元素全組合

編輯:C++入門知識

原創博客,轉載請注明出處。http://blog.csdn.net/zhouqinghe24

要求:將下列數組中各取一個元素組合所有可能的組合

{a,b,c}

{b,c}

{a,b,d,h}


將這些數組組合成一個新的數組的數組

var Arrays={{a,b,c},{b,c},{a,b,d,h}};


原創博客,轉載請注明出處。http://blog.csdn.net/zhouqinghe24

分析:常規進位制比如 十進制、二進制、十六進制等每個數位的進制都是相同的,思及此處,樓主用了每個數位的進位制不同的方法來排列組合元素。

第一個數組 第二個數組 第三個數組 的長度分別為 3,2,4

那麼索引的組合在此特例進位制中的最小值為000最大值為 213 。

即000,001,002,003,010,011,012,013,100,101,102,103,110,111,112,113,200,201,202,203,210,211,212,213

共24個

每一個組合就是以上三個數組的索引。

原創博客,轉載請注明出處。http://blog.csdn.net/zhouqinghe24

下面寫的是javascript版的代碼實現。


function getDetial(Arrays) {

    var counts = [], result = [];
    for (var k = 0; k < Arrays.length; k++) {
        if (minArrays[k].length != 0) {
            counts.push(Arrays[k].length);
        }
    }
    var g = UnRecursive(counts);//獲取索引列表

    for (var i = 0; i < g.length; i++) {
        var ele = g[i];
        var re = [];
        for (var j = 0; j < ele.length; j++) {
            re.push(Arrays[j][ele[j]]);
        }
        result.push(re);
        //  alert(str);
    }
    return result;
}

原創博客,轉載請注明出處。http://blog.csdn.net/zhouqinghe24


function UnRecursive(Counts) {
    var list = [];
    var m_totalChips = 1;
    for (var i = 0; i < Counts.length; i++) {
        if (Counts[i] > 0) {
            m_totalChips *= Counts[i];
        }
    }

    var nums = new Array(Counts.length);
    for (var x = 0; x < Counts.length; x++) {
        nums[x] = Counts[x] > 0 ? 0 : -1;
    }
    var last = Counts.length - 1;
    while (nums[last] == -1 && last != 0) {
        last--;
    }
    for (var j = 0; j < m_totalChips; j++) {
        list.push(nums.concat());
        nums[last]++;
        for (var i = Counts.length - 1; i > 0; i--) {
            if (nums[i] >= Counts[i]) {
                nums[i] = 0;
                var next = i - 1;
                while (nums[next] == -1 && next != 0) {
                    next--;
                }
                if (nums[i] != -1) {
                    nums[next]++;
                }
                if (nums[0] > Counts[0]) {
                    break;
                }
            }
        }
    }
    return list;
}
原創博客,轉載請注明出處。http://blog.csdn.net/zhouqinghe24

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved