爱消除游戏中的消除算法

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

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

[
  { 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());//打印出来的就是最终应该消除的位置数组

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值