【问题标题】:Comparing 2 elements of a 3x3 matrix to see if element 2 is adjacent to element 1比较 3x3 矩阵的 2 个元素以查看元素 2 是否与元素 1 相邻
【发布时间】:2012-02-06 08:48:55
【问题描述】:

基本上,我正在创建一个可以交换碎片的谜题。而且我想确保在交换 2 个元素时,选择是有效的。

由于拼图只有 9 块(3x3),我目前正在使用代码:

  function valid_selection(p1, p2) {
   if (p1 == 1 && (p2 == 2 || p2 == 4)) return true;
   if (p1 == 2 && (p2 == 1 || p2 == 3 || p2 == 5)) return true;
   if (p1 == 3 && (p2 == 2 || p2 == 6)) return true;
   if (p1 == 4 && (p2 == 1 || p2 == 5 || p2 == 7)) return true;
   if (p1 == 5 && (p2 == 2 || p2 == 4 || p2 == 6 || p2 == 8)) return true;
   if (p1 == 6 && (p2 == 3 || p2 == 5 || p2 == 9)) return true;
   if (p1 == 7 && (p2 == 4 || p2 == 8)) return true;
   if (p1 == 8 && (p2 == 5 || p2 == 7 || p2 == 9)) return true;
   if (p1 == 9 && (p2 == 6 || p2 == 8)) return true;

   return false;
  }

但是,我可以以编程方式执行此操作吗?有人知道这样的算法吗?

感谢任何帮助。

【问题讨论】:

  • 请描述检查顺序,因为我们不知道游戏规则。
  • 您可以通过研究我当前的代码轻松地看到这一点。这有点难以解释,
  • 是的,很抱歉模棱两可,从技术上讲是这样。但是将来我可能想从 3x3 矩阵变为 4x4,然后我必须硬编码 16 种可能性,我相信你同意当我将它增加到一个 100*100 的矩阵,以此类推。

标签: algorithm validation matrix selection


【解决方案1】:

假设你的矩阵有这样的位置:

1 2 3
4 5 6
7 8 9

您应该能够做到以下几点:

if ( abs(p2-p1) == 3 // test for vertical connectedness
        || ( abs(p2-p1) == 1 // test for horizontal connectedness
        && ( p1+p2 != 7 && p1+p2 != 13) ) ) // except for edge cases (3,4 and 6,7)
    return true;

【讨论】:

  • 我的矩阵就是这样,它不能正常工作。示例: let p1=4 and p2=3 它不应该匹配,因为 p2 在右上角(p1 在左中),但它通过了 if 测试。
  • 不,这在 p1=2,p2=5 应该匹配时失败,同样在:p1=5,p2=8 上失败
  • 我不知道为什么它会失败,如果你看一下代码 - 显然它会在 2,5 和 5,8 上返回 true。检查以确保您的牙套正确。
  • 糟糕,我的错。它确实有效。还有一个问题,7 和 13 有什么特别之处,你是怎么得出的?为您的帮助干杯。
  • 水平连通性是指 p1 和 p2 相距 1,但位置 (3,4) 和 (6,7) 除外。因此,您可以添加 p1+p2 来检查它们是否在这些位置 - 然后将它们排除在外。有一种更通用的方法(您可以使用矩阵的宽度来代替),但这足够小,没关系。
【解决方案2】:

您还可以将网格上的每个部分转换为坐标形式。

即:

1 是 (0,0), 2 是 (0,1), 3 是 (0,2), 4 是 (1,0), 等等

所以,假设 p1 的坐标是 (x_p1, y_p1) 并且 p2 是 (x_p2, y_p2) 那么你的函数将在以下情况下返回 true:

( abs(x_p2 - x_p1) + abs(y_p2 - y_p1) ) == 1

我认为...?没试过。

无论网格大小如何,这都应该有效。

【讨论】:

    【解决方案3】:

    假设这是 JavaScript:

    var N = 3;  // size of matrix
    
    var x1 = p1 % N, y1 = Math.floor(p1 / N);
    var x2 = p2 % N, y2 = Math.floor(p2 / N);
    
    return (x1 == x2 && Math.abs(y2 - y1) == 1) ||
           (y1 == y2 && Math.abs(x2 - x1) == 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-10
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多