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 returntrue
,我们可能会存储相应的序列并停止搜索
迭代每一行
#板{
填充: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;
}