二维数组转换算法,最好是js,或者其他语言也行。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组转换算法,最好是js,或者其他语言也行。相关的知识,希望对你有一定的参考价值。

从二维数组 中每个数组中抽出一项 组成新的二维数组,不能有重复,不能有遗漏,这个应该怎么写?
就是:[[2,3],[4],[5,6],[7]] => [[2,4,5,7],[2,4,6,7],[3,4,5,7],[3,4,6,7]]
[[2,3],[3],[5,6],[7]] => [[2,3,5,7],[2,3,6,7],[3,3,5,7],[3,3,6,7]]

<script>
var arr = [[2,3],[4],[5,6],[7]];
var result = '';
function transform(i,s) 
if (i == 0) s += '[';
if (i == arr.length) 
result += s.substring(0,s.length-1)+'],';
return;

var arr1 = arr[i];
for (var j = 0; j < arr1.length; j++) 
transform(i+1,s+arr1[j]+',');


transform(0,'');
result = '['+result.substring(0,result.length-1)+']';
var resultArr = eval(result);
document.write(resultArr[2][2]);
</script>

追问

大神 :[[a:2,a:3],[a:3],[a:5,a:6],[a:7]] =>
[[a:2,a:3,a:5,a:7],[a:2,a:3,a:6,a:7],[a:3,a:3,a:5,a:7],[a:3,a:3,a:6,a:7]]

这样的应该怎么写呢?

追答

只需修改一处地方即可,把JSON对象转为字符串,上面12行改为

transform(i+1,s+JSON.stringify(arr1[j])+',');

如果浏览器不支持JSON,则需要自行下载json.js

https:删除我//github.com/douglascrockford/JSON-js

参考技术A 给你一个完美的递归算法
比他们的都好,我敢这么说:

var array = [['A', 'B', 'C'], 'F', ['D', 'E'], 1, 'kyo', 'yugi111'];
var len = array.length;
var results = [];
var indexs = ;
function specialSort(start) 
    start++;
    if (start > len - 1) 
        return;
    
    if (!indexs[start]) 
        indexs[start] = 0;
    
    if (!(array[start] instanceof Array)) 
        array[start] = [array[start]];
    
    for (indexs[start] = 0; indexs[start] < array[start].length; indexs[start]++) 
        specialSort(start);
        if (start == len - 1) 
            var temp = [];
            for (var i = len - 1; i >= 0; i--) 
                if (!(array[start - i] instanceof Array)) 
                    array[start - i] = [array[start - i]];
                
                temp.push(array[start - i][indexs[start - i]]);
            
            results.push(temp);
        
    


specialSort(-1);
console.log(results);

参考技术B 随即一个随即点,用这个点来随即

js实现2048小游戏二维数组更新算法

2048小游戏是当下比较流行的益智游戏了,而它最关键的模块莫过于当手指滑过或鼠标按下后如何确定更新的值。

首先该游戏可以看作一个4*4的二维数组的更新游戏,玩家通过控制数组内元素的合并来不断产生更大的数字,当方向确定时,每一行或每一列的计算方式实际上是一样的,例如,当我确定方向为向左时,每一行的计算方式都是一样的,这样,我们就可以将二维数组的计算简化为一维数组的计算了,然后通过循环计算其他行即可。

而一维数组中主要就是寻找相邻的两个非空值进行合并,相关函数可表示如下:

// 一维数组合并相邻非空项
    function mergeArrayElement(arr) {
        var newArr = []
        var index = -1 // index为-1表示未找到一个非空值
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] != 0) {
                if (index != -1) {
                    if (arr[index] == arr[i]) {
                        newArr.push(arr[index] * 2)
                        index = -1
                    } else {
                        newArr.push(arr[index])
                        index = i
                    }
                } else {
                    index = i
                }
            }
        }
        if (index != -1) newArr.push(arr[index])
        // 如果新数组长度不足4,补0
        while (newArr.length < 4) {
            newArr.push(0)
        }
        return newArr
    }

 

其他方向也都大同小异,稍微对数组加工一下即可获取到更新后的二维数组值,这里贴出完整代码供参考

var arr = [
    [1122],
    [1222],
    [1002],
    [1224],
]
console.log(get2048NewArray(arr, ))
console.log(get2048NewArray(arr‘left‘))   // [ [ 2, 4, 0, 0 ], [ 1, 4, 2, 0 ], [ 1, 2, 0, 0 ], [ 1, 4, 4, 0 ] ]
console.log(get2048NewArray(arr‘right‘))  // [ [ 0, 0, 2, 4 ], [ 0, 1, 2, 4 ], [ 0, 0, 1, 2 ], [ 0, 1, 4, 4 ] ]
console.log(get2048NewArray(arr‘up‘))     // [ [ 2, 2, 0, 0 ], [ 1, 4, 0, 0 ], [ 4, 2, 0, 0 ], [ 4, 2, 4, 0 ] ]
console.log(get2048NewArray(arr‘down‘))   // [ [ 0, 0, 2, 2 ], [ 0, 0, 1, 4 ], [ 0, 0, 2, 4 ], [ 0, 2, 4, 4 ] ]


function get2048NewArray(arrdirection) {
    var arrT = arrayTransposition(arr)
    var newArr = []
    switch (direction) {
        // 向上
        case ‘up‘:
            for (var i = 0i < 4i++) {
                newArr[i] = mergeArrayElement(arrT[i])
            }
            break
            // 向下
        case ‘down‘:
            for (var i = 0i < 4i++) {
                newArr[i] = mergeArrayElement(arrT[i].reverse()).reverse()
            }
            break
            // 向右
        case ‘right‘:
            for (var i = 0i < 4i++) {
                // 为了不影响原数组,slice复制一下
                newArr[i] = mergeArrayElement(arr[i].slice().reverse()).reverse()
            }
            break
        case ‘left‘:
        default:
            // 向左
            for (var i = 0i < 4i++) {
                newArr[i] = mergeArrayElement(arr[i])
            }
    }
    return newArr

    // 一维数组合并相邻非空项
    function mergeArrayElement(arr) {
        var newArr = []
        var index = -1 // index为-1表示未找到一个非空值
        for (var i = 0i < arr.lengthi++) {
            if (arr[i] != 0) {
                if (index != -1) {
                    if (arr[index] == arr[i]) {
                        newArr.push(arr[index] * 2)
                        index = -1
                    } else {
                        newArr.push(arr[index])
                        index = i
                    }
                } else {
                    index = i
                }
            }
        }
        if (index != -1newArr.push(arr[index])
        // 如果新数组长度不足4,补0
        while (newArr.length < 4) {
            newArr.push(0)
        }
        return newArr
    }

    // 二维数组转置
    function arrayTransposition(arr) {
        var newArr = [
            [],
            [],
            [],
            []
        ]
        for (var i = 0i < arr.lengthi++) {
            for (var j = 0j < arr[0].lengthj++) {
                newArr[i][j] = arr[j][i]
            }
            // console.log(newArr[0][0])
        }
        return newArr
    }
}

 

var arr = [
    [1122],
    [1222],
    [1002],
    [1224],
]
console.log(get2048NewArray(arr, ))
console.log(get2048NewArray(arr‘left‘))   // [ [ 2, 4, 0, 0 ], [ 1, 4, 2, 0 ], [ 1, 2, 0, 0 ], [ 1, 4, 4, 0 ] ]
console.log(get2048NewArray(arr‘right‘))  // [ [ 0, 0, 2, 4 ], [ 0, 1, 2, 4 ], [ 0, 0, 1, 2 ], [ 0, 1, 4, 4 ] ]
console.log(get2048NewArray(arr‘up‘))     // [ [ 2, 2, 0, 0 ], [ 1, 4, 0, 0 ], [ 4, 2, 0, 0 ], [ 4, 2, 4, 0 ] ]
console.log(get2048NewArray(arr‘down‘))   // [ [ 0, 0, 2, 2 ], [ 0, 0, 1, 4 ], [ 0, 0, 2, 4 ], [ 0, 2, 4, 4 ] ]


function get2048NewArray(arrdirection) {
    var arrT = arrayTransposition(arr)
    var newArr = []
    switch (direction) {
        // 向上
        case ‘up‘:
            for (var i = 0i < 4i++) {
                newArr[i] = mergeArrayElement(arrT[i])
            }
            break
            // 向下
        case ‘down‘:
            for (var i = 0i < 4i++) {
                newArr[i] = mergeArrayElement(arrT[i].reverse()).reverse()
            }
            break
            // 向右
        case ‘right‘:
            for (var i = 0i < 4i++) {
                // 为了不影响原数组,slice复制一下
                newArr[i] = mergeArrayElement(arr[i].slice().reverse()).reverse()
            }
            break
        case ‘left‘:
        default:
            // 向左
            for (var i = 0i < 4i++) {
                newArr[i] = mergeArrayElement(arr[i])
            }
    }
    return newArr

    // 一维数组合并相邻非空项
    function mergeArrayElement(arr) {
        var newArr = []
        var index = -1 // index为-1表示未找到一个非空值
        for (var i = 0i < arr.lengthi++) {
            if (arr[i] != 0) {
                if (index != -1) {
                    if (arr[index] == arr[i]) {
                        newArr.push(arr[index] * 2)
                        index = -1
                    } else {
                        newArr.push(arr[index])
                        index = i
                    }
                } else {
                    index = i
                }
            }
        }
        if (index != -1newArr.push(arr[index])
        // 如果新数组长度不足4,补0
        while (newArr.length < 4) {
            newArr.push(0)
        }
        return newArr
    }

    // 二维数组转置
    function arrayTransposition(arr) {
        var newArr = [
            [],
            [],
            [],
            []
        ]
        for (var i = 0i < arr.lengthi++) {
            for (var j = 0j < arr[0].lengthj++) {
                newArr[i][j] = arr[j][i]
            }
            // console.log(newArr[0][0])
        }
        return newArr//.reverse()
    }
}

以上是关于二维数组转换算法,最好是js,或者其他语言也行。的主要内容,如果未能解决你的问题,请参考以下文章

请问C语言中数字一维数组转换二维数组通项公式?

C语言一维数组转二维数组

js怎样将一维数组转换成二维数组

快速查找二维数组的所有峰值,c语言实现最好,python也可以,最好能实现滤波。

使用 vue.js 将二维关联数组转换为 Object

JS二维数组转换一维数组