繁体   English   中英

匹配矩阵的Javascript模式

[英]Javascript Pattern Matching a Matrix

在javascript中,我有一个矩阵数组,每个矩阵都是5x5。 例如:

25, 32, 26, 27, 29
01, 22, 15, 17, 99
12, 14, 17, 19, 88
16, 14, 12, 17, 19
02, 08, 09, 18, 19

我有一个方法findMatches (a, b, c, d, e) ,它需要五个数字值。 目标是返回符合以下任意条件的新矩阵数组:

findMatches (a, b, c, d, e)方法中的至少4个数字与任何矩阵行中的至少4个连续数字匹配。 例如。 如果矩阵行具有22, 23, **29**, 24, 25则该行将不匹配,因为该方法中的四个数字之间没有一组紧挨着(但是,如果顺序匹配,则没有关系方法提供的整数顺序可以是a,c,d,e,也可以。) 但是,如果它是22, 26, 23, 24则它将匹配,因为该方法中至少有四个连续的数字。 例如:

**22**, 32, 26, 27, 29
**26**, 22, 15, 17, 99
**23**, 14, 17, 19, 88
**24**, 14, 12, 17, 19
  02,   08, 09, 18, 19

与上面相同,但在任何矩阵列而不是行中

20, 01, 02,  03,  08
01,*22,*23*,*25*,*24*
12, 14, 17, 19, 88
16, 14, 12, 17, 19
02, 08, 09, 18, 19

与最后两个相同,但对角线,而不是一行或一列

**22**, 32, 26, 27, 29            01, 02, 03,   04,   05
01, **23**, 15, 17, 99            06, 07, 08, **24**, 10
12, 14, **26**, 19, 88            11, 12, **23**, 14, 15
16, 14, 12, **25**, 19            16, **25**, 18, 19, 20
02, 08, 09,   18,   19          **22**, 22,   23, 24, 25

任何矩阵中没有两个数字是相同的。 例如,在整个矩阵中,数字1不会超过一次。

我不太确定该如何处理。 我的第一个直觉是坐在那里并生成所有可能的矩阵来检查是否匹配,但是考虑到可能存在的组合超过一百万种,这显然是不可行的。

所以这是使用正则表达式的解决方案:

首先,我假设每个矩阵都以您指定的文本格式存储(这很重要,因为正则表达式可能需要进行其他调整)。

我们将使用这种模式(您需要用变量代替01、02、03、20)。 我会解释一下

(01|02|03|20), (?!\1)(01|02|03|20), (?!\1)(?!\2)(01|02|03|20), (?!\1)(?!\2)(?!\3)(01|02|03|20)

首先,我们匹配任何数字。 然后是一个逗号,然后是不是第一个数字的任何数字。

(?!\\1)正在做几件事。 首先,它执行一个“负超前断言”,该断言在不消耗字符的情况下向前看,并确保它们不包含\\1 ,这是对第一个捕获到的数字的反向引用。

将其用于垂直和对角线列表很简单,只需抓住适当的行并将其转换为水平格式,然后在其上运行正则表达式即可。

希望这可以帮助您入门。 如果碰到墙,请随意发帖。

非正则表达式方法。

var matrix;

function findMatches(a, b, c, d, e) {
    // Rows
    for (var i = 0; i < matrix.length; i++) {
        if (checkMatch(matrix[i], [a, b, c, d, e]))
            return true;
    }

    // Columns
    for (var i = 0; i < matrix[0].length; i++) {
        if (checkMatch(getColumn(matrix, i), [a, b, c, d, e]))
            return true;
    }

    // Diagonals
    var diagonalArray = [];
    for (var i = 0; i < matrix.length; i++) {
        for (var x = 0; x < matrix[i].length; x++) {
            if (i === x) {
                diagonalArray.push(matrix[i][x]);
                continue;
            }
        }
    }
    if (checkMatch(diagonalArray, [a, b, c, d, e]));
        return true;

    var revDiagonalArray = [];
    for (var i = 0; i < matrix.length; i++) {
        for (var x = 0; x < matrix[i].length; x++) {
            if (i === 4 - x) {
                revDiagonalArray.push(matrix[i][x]);
                continue;
            }
        }
    }
    if (checkMatch(revDiagonalArray, [a, b, c, d, e]));
        return true;

    return false;
}

function getColumn(matrix, columnIndex) {
    var array = [];
    for (var i = 0; i < matrx.length; i++)
        array.push(matrix[i][columnIndex]);
    return array;
}

function checkMatch(array, toMatch) {
    var matchCount = 0;
    for (var i = 0; i < array.length; i++) {
        if (toMatch.indexOf(array[i]) > -1) {
            matchCount++;
            if (matchCount === 4)
                return true;
        }
        else if (i > 0)
            break;
    }
    return false;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM