如何判断矩阵中的值是否为相邻区域

发布于 2022-09-05 23:25:20 字数 157 浏览 17 评论 0

比如这样一个3X3的矩阵,如何判断选中的数据为相邻矩形区域??
1 2 3
4 5 6
7 8 9

比如

1,2,4,5就是同一个区域

1,2,3,4就不是一个区域

最好是根据选中的值的索引值来判断

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

蓝礼 2022-09-12 23:25:20

假设坐标是二维数组的形式:

const data = [
  [101, 108],
  [100, 108],
]

const isDataRect = data => {
  let xMin = +Infinity,
    yMin = +Infinity,
    xMax = -Infinity,
    yMax = -Infinity;

  data.forEach(coord => {
    let [x, y] = coord;
    x = Number(x);
    y = Number(y);

    xMin = Math.min(xMin, x);
    yMin = Math.min(yMin, y);
    xMax = Math.max(xMax, x);
    yMax = Math.max(yMax, y);
  })

  return data.length === (xMax - xMin + 1) * (yMax - yMin + 1)
}

console.log(isDataRect(data))
十年不长 2022-09-12 23:25:20
const pow2 = x => Math.pow(x, 2)

const isDataRect = (arr) => {
  let flag = true
  let count = 0
  const act = arr.length
  let exp = 0
  let lt = [0, 0]
  let rb = [0, 0]

  while (count < act) {
    const _lt = arr[count]
    const _rb = arr[++count]

    if (!_rb) {
      flag = act === exp
      break
    }

    const [_x1, _y1] = _lt
    const [_x2, _y2] = _rb
    let [x1, y1] = lt
    let [x2, y2] = rb

    const offset = pow2(x2 - x1) + pow2(y2 - y1)
    const offsetLt = pow2(x2 - _x1) + pow2(y2 - _y1)
    const offsetRb = pow2(_x2 - x1) + pow2(_y2 - y1)

    if (offsetLt > offset) {
      x1 = _x1
      y1 = _y1
    }
    if (offsetRb > offset) {
      x2 = _x2
      y2 = _y2
    }

    exp = Math.max((Math.abs(x2 - x1) + 1) * (Math.abs(y2 - y1) + 1), exp)

    console.log(`${x1}, ${y1}`, '|', `${x2}, ${y2}`, '|', act, exp)

    if (exp > act) {
      flag = false
      break
    }
  }

  return flag
}
只为守护你 2022-09-12 23:25:20

按照你的表述,待测试数据非矩阵形式表示,那么原矩阵必须没有重复元素,否则就会出现不同结果


// 原始矩阵无重复,可任意排列
// 测试矩阵非矩阵形式任意排列

function isDataRect(arr, data) {    
  let subArray = [];

  arr.forEach(el => {
      for (let i = 0; i < data.length; i++) {
      let j = data[i].indexOf(el);
        if (j != -1) {
          if (!subArray[i]) {
            subArray[i] = [];
        }
          subArray[i].push(j);
      }
    }
  });
  for (let i = 1; i < subArray.length; i++) {
      if (!subArray[i -1]) continue;
      if (!subArray[i] || subArray[i - 1].sort().toString() != subArray[i].sort().toString()) {
        return false;
    }
  }
  return true;
}

const data = [[1,2,3], [4,5,6],[7,8,9]];
const arr1 = [1,2,5,4], arr2 = [1,2,4,5], arr3 = [5,8], arr4 = [5,6], arr5 = [1,7], arr6 = [1,2,3,4];

console.log(isDataRect(arr1, data)); //true
console.log(isDataRect(arr3, data)); //true
console.log(isDataRect(arr3, data)); //true
console.log(isDataRect(arr4, data)); //true
console.log(isDataRect(arr5, data)); //false
console.log(isDataRect(arr6, data)); //false
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文