如何获得矩阵中两个数字之间的对角线数字?

时间:2019-05-07 09:18:03

标签: javascript arrays algorithm

如何检查方矩阵的两个索引是否对角线。考虑数组。

[
 0 , 1 , 2 , 3 ,
 4 , 5 , 6 , 7 ,
 8 , 9 , 10, 11,
 12, 13, 14, 15
]

创建一个包含三个参数数组和两个索引的函数。如果两个索引彼此对角,则应返回true,否则返回false对于上述数组。

0,15 => true
3,12 => true
11,6 => true
9,6  => true

4,15 => false
8,12 => false
1,10 => false //my code fails for this.

我试图创建一个函数,但是根本无法正常工作。

function check(arr,a,b){
  let len = Math.sqrt(arr.length);
  let dif = Math.abs(a-b);
  return dif % (len+1) === 0 ||  dif % (len - 1) === 0
}

可以给它一个简单的解决方案。

2 个答案:

答案 0 :(得分:12)

只需获取col和row,并检查delta是否相同。

(实际上并不需要采用数组,所以我只是采用维度)

function check(dim,a,b){
  let [x1,y1]=[Math.floor(a/dim),a%dim]
  let [x2,y2]=[Math.floor(b/dim),b%dim]
  return Math.abs(x1-x2)==Math.abs(y1-y2)
}

console.log(check(4,0,15))
console.log(check(4,3,12))
console.log(check(4,11,6))
console.log(check(4,9,6))
console.log(check(4,4,15))
console.log(check(4,8,12))
console.log(check(4,6,12))

答案 1 :(得分:5)

您可以采用绝对增量,然后与余数运算符一起检查增量是否为长度的整数倍减一或加一。

function check(array, i, j) {
   var length = Math.sqrt(array.length),
       delta = Math.abs(i - j),
       lines = Math.abs(Math.floor(i / length) - Math.floor(j / length));
   
   return delta === lines * (length - 1) || delta === lines * (length + 1);
}

var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];

console.log(check(array, 0, 15)); // true
console.log(check(array, 3, 12)); // true
console.log(check(array, 11, 6)); // true
console.log(check(array, 9, 6)); // true

console.log(check(array, 4, 15)); // false
console.log(check(array, 8, 12)); // false
console.log(check(array, 8, 3)); // false
.as-console-wrapper { max-height: 100% !important; top: 0; }