Javascript 如何在平方矩阵中找到连续的符号序列

Javascript 如何在平方矩阵中找到连续的符号序列,javascript,for-loop,Javascript,For Loop,我需要帮助找到正确的算法。我有一个二维数组,例如: var arr = [ [""," "," "," ",""], [""," "," "," ",""], [""," "," ","X",""], ["","X","X","X",""], [""," "," ","X",""]]; 我想验证这个数组是否有三个相邻的符号,它们在任何方向(水平、垂直或交叉)上相互匹配,然后显示这些符号 我是这样做的: 贯穿阵列: for(var i = 0; i < arr.length; i+=1){

我需要帮助找到正确的算法。我有一个二维数组,例如:

var arr = [
[""," "," "," ",""],
[""," "," "," ",""],
[""," "," ","X",""],
["","X","X","X",""],
[""," "," ","X",""]];
我想验证这个数组是否有三个相邻的符号,它们在任何方向(水平、垂直或交叉)上相互匹配,然后显示这些符号

我是这样做的:

贯穿阵列:

for(var i = 0; i < arr.length; i+=1){
   for(var j = 0; j < arr.length; j+=1){
但是它会给出一个错误,因为
i+1
i+2
在数组后面

我已尝试验证以下情况:

  if(arr[i][j+1] < arr.length)
if(arr[i][j+1]
但它不算最后几行


怎么做?

I
时,您的循环应该停止,因为您希望确保
I+2
在范围内。

三个连续的X符号由其中心和方向(水平、垂直或两条对角线中的一条)唯一定义。我会这样做(谢谢@DarthJS):

for(变量i=0;i0&&i0&&j0&&i0&&j
您可以尝试为每行、每列或每对角线连续计数

给定一个计算连续“X”的阶跃函数 然后,您可以迭代并查找步骤结果。如果step return
true
,我们可能会存储相应的序列并停止搜索

迭代每一行
#板{
填充:0;
保证金:0;
字号:0;
}
.cell、.validCell、.selectCell{
显示:内联块;
框大小:边框框;
边框:1px实心#888;
宽度:40px;
高度:40px;
}
validCell先生{
背景#CDEB8B;
}
.selectCell{
背景:DDD;
}
.马克{
背景:#888;
宽度:16px;
高度:16px;
利润率:12px 0 0 12px;
}

您是否尝试过执行
if(arr[i][j+1]查看数组内容(
arr[i][j+1]
)确定是否在边界内是没有意义的。但是在最后一列中找不到垂直排列,在最后一行中找不到水平排列。但是我不会遍历all数组。这是我的最后一条规则:if(arr[I][j+1]arr[i+2][j]
,最好确保
i
(这样
i+2
)。它不会验证最后一行等待,你的循环从i=0和j=0开始,但所有情况下都只在i>0和j>0时验证。有冲突吗?没有,当i=0时“垂直”部分仍然被检查。对于j=0“水平”部分。哇,非常感谢你的回答,我希望这会有所帮助,无论如何,我相信我会从中学习一些有用的动作。非常非常感谢s:)
  if(arr[i][j+1] < arr.length)
for (var i = 0; i < arr.length; i+=1) {
    for (var j = 0; j < arr.length; j+=1) {
        // Horizontal
        if (i > 0 && i < arr.length - 1 &&
            arr[i-1][j] == "X" && arr[i][j] == "X" && arr[i+1][j] == "X") {
            console.log(arr[i][j]);
        }
        // Vertical
        if (j > 0 && j < arr.length - 1 &&
            arr[i][j-1] == "X" && arr[i][j] == "X" && arr[i][j+1] == "X") {
            console.log(arr[i][j]);
        }
        // Diagonal
        if (i > 0 && i < arr.length - 1 &&
            j > 0 && j < arr.length - 1) {
            if (arr[i-1][j-1] == "X" && arr[i][j] == "X" && arr[i+1][j+1] == "X") {
                console.log(arr[i][j]);
            }
            if (arr[i-1][j+1] == "X" && arr[i][j] == "X" && arr[i+1][j-1] == "X") {
                console.log(arr[i][j]);
            }
        }
    }
}
data = {
    succX = 0
};

function step (data, arr, i, j) {
    data.succX = arr[i][j] === "X" ? data.succX + 1 : 0;
    return data.succX >= 3;;
}
for (var i = 0, nbRow = arr.length; i < nbRow; i++) {
    for (var j = 0, nbCol = arr[i].length; j < nbCol; j++) {
        data.winSeq = data.winSeq || step(data, arr, i, j) && [[i, j-2], [i, j-1], [i, j]];
    }
}

data.succX = 0;
for (var j = 0, nbCol = arr[0].length; j < nbCol; j++) {
    for (var i = 0, nbRow = arr.length; i < nbRow; i++) {
        data.winSeq = data.winSeq || step(data, arr, i, j) && [[i-2, j], [i-1, j], [i, j]];
    }
}
for (var d = 0, dim = arr.length, nbDiag = dim * 2 - 1; d < nbDiag; d++) {
    var maxE = d >= dim ? nbDiag - d - 1 : d;
    for (var e = 0; e <= maxE; e++) {
        var i = Math.min(d, dim -1) - e,
            j = Math.max(0, d - dim + 1) + e;
        data.winSeq = data.winSeq || step(data, arr, i, j) && [[i, j-2], [i+1, j-1], [i+2, j]];
    }
    data.succX = 0;
}

for (var d = 0, dim = arr.length, nbDiag = dim * 2 - 1; d < nbDiag; d++) {
    var maxE = d >= dim ? nbDiag - d - 1 : d;
    for (var e = 0; e <= maxE; e++) {
        var i = dim - 1 -Math.min(d, dim -1) + e,
            j = Math.max(0, d - dim + 1) + e;
        data.winSeq = data.winSeq || step(data, arr, i, j) && [[i-2, j-2], [i-1, j-1], [i, j]];
    }
    data.succX = 0;
}