爱消除游戏中的消除算法

Posted 六月June June

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爱消除游戏中的消除算法相关的知识,希望对你有一定的参考价值。

需求:要得到一个二维数组中每一行和每一列中连续重复三次或三次以上的元素的位置数组。

如上图所示中的这个数组,我们要得到的位置数组为

[
   row: 0, col: 1 ,
   row: 0, col: 2 ,
   row: 0, col: 3 ,
   row: 0, col: 4 ,
   row: 1, col: 2 ,
   row: 2, col: 2 
]

需求说完了,下面就是代码细节了

首先,我们要得到每一行连续重复3次或3次以上元素的位置数组

/**
计算数组中每一行的连续重复项3或者3次以上的元素的位置数组
本函数中用到的算法我将它称为"i j指针法"
params1 原数组
params2 是否为原数组的row和col颠倒过的新数组,是就为true,否则为false
return 返回应该消除的位置数组
 * */
function rowChong(arr, isCol2Row) 
    let results = [];
    for (let row = 0; row < arr.length; row++) 
        // i指针和j指针
        let i = 0;
        let j = 1;
        let result = []; //存连续重复项的下标数组
        while (i < arr[row].length) 
            if (arr[row][j] != arr[row][i]) 
                if (j - i >= 3) 
                    for (let m = i; m <= j - 1; m++) 
                        if (isCol2Row) 
                            results.push("row": m, "col": row);
                         else 
                            results.push("row": row, "col": m);
                        
                    
                
                i = j;
            
            j++;
        
    
    return results;

然后,我们要得到每一列连续重复3次或3次以上元素的位置数组

function colChong(arr) 
    //为了使用rowChong()函数,所以需要将原数组的col颠倒成row
    let cols = [];
    for (let row = 0; row < arr.length; row++) 
        let _col = [];
        for (let col = 0; col < arr[row].length; col++) 
            _col.push(arr[col][row]);
        
        cols.push(_col);
    
    return rowChong(cols, true)
最后:将每一行和每一列应该消除的位置数组合并成一个最终应该消除的位置数组
function getPositionArrs() 
    //将每一行和每一列应该消除的位置数组合并成一个位置数组
    let _result = rowChong(arr, false).concat(colChong(arr))
    //result数组中可能存在重复元素,所以需要去重
    //1.把每一项变成字符串
    let resultArr = _result.map((item, index) => 
        return JSON.stringify(_result[index]);
    );
    //2.利用set特性去重
    let newresultArr = [...new Set(resultArr)];
    //3.把每一项变回json
    let results = newresultArr.map((item, index) => 
        return JSON.parse(newresultArr[index]);
    );
    //返回最终去重过的位置数组
    return results;


console.log(getPositionArrs());//打印出来的就是最终应该消除的位置数组

 

 

 

以上是关于爱消除游戏中的消除算法的主要内容,如果未能解决你的问题,请参考以下文章

有一个unity出的游戏,是一个圆柱形上升彩色方块消除的游戏(三个以上可以消除),求叫啥

老Java程序员花两天做了个消消乐(天天爱消除)

390. 消除游戏

数据结构与算法之深入解析“消除游戏”的求解思路与算法示例

《LeetCode之每日一题》:254.消除游戏

华为OD机试 - 消消乐游戏(Java) | 机试题+算法思路+考点+代码解析 2023