比较 3x3 矩阵的 2 个元素,查看元素 2 是否与元素 1 相邻

发布于 2024-08-16 07:32:32 字数 841 浏览 8 评论 0原文

基本上,我正在创建一个可以交换碎片的拼图。我想确保交换 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;
  }

但是,我可以通过编程来完成此操作吗?有人知道这样的算法吗?

任何帮助表示赞赏。

Basically, I'm creating a puzzle where you can swap pieces. And I want to make sure that when swapping 2 elements, the selection is valid.

Since the puzzle is only 9 pieces (3x3), I am currently using the code:

  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;
  }

But, can I do this programatically? Anyone know of such an algorithm?

Any help is appreciated.

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

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

发布评论

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

评论(3

护你周全 2024-08-23 07:32:32

假设您的矩阵具有如下位置:

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;

Assuming your matrix has positions like so:

1 2 3
4 5 6
7 8 9

You should be able to do the following:

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;
俏︾媚 2024-08-23 07:32:32

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

即:

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

I思考...?还没有实际尝试过。

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

You could also convert each piece on the grid into coordinate form.

ie:

1 is (0,0),
2 is (0,1),
3 is (0,2),
4 is (1,0),
etc

So, given that the coordinate of p1 is (x_p1, y_p1) and p2 is (x_p2, y_p2) then your function would return true if:

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

I think...? Haven't actually tried it.

And this should work regardless of grid size.

云淡风轻 2024-08-23 07:32:32

假设这是 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);

Assuming this is 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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文