【问题标题】:Fill 2D array with 2 different numbers, but each number has to be placed next to an equal number用 2 个不同的数字填充 2D 数组,但每个数字必须放在相同的数字旁边
【发布时间】:2015-10-05 14:03:23
【问题描述】:

我正在尝试用 0 和 1 随机填充二维数组。条件是每个 1 必须垂直或水平地“放置”在另一个 1 旁边,但不能对角线。

http://prntscr.com/8nzl19 在屏幕截图中,您可以看到 3 个 1 块。我希望它们被“连接”起来,这样只有一个 1 块。

是否有任何算法或其他东西可以做到这一点?

【问题讨论】:

  • 连接是什么意思?我不完全明白你的问题。
  • 你说的not diagonally是什么意思??如果我将您的示例视为 7x7 矩阵,则 (2,2) 处的 1(3,1) 处的 1 对角放置。不是吗?
  • 每个 0 是否也必须放在另一个 0 旁边?
  • 您首先用 0 填充数组,然后随机放置 1,但总是在已经存在的旁边放置 1,当然第一个 1 除外。
  • 这需要更正式的描述。 “随机”是什么意思?你想从所有可能的板上均匀地取样吗?这可能很难做到。一种理论方法就是:随机填充+检查是否满足约束。这就是某种拉斯维加斯算法,它可能永远不会停止用于大板!

标签: arrays algorithm random multidimensional-array


【解决方案1】:

由于一种简单的方法是用 1 填充整个矩阵,我假设您希望最小数量的 0 变为 1。

您可以使用以下方法:

  • 在矩阵中找出 1 的所有分量。 (给它们一个标识符,让我们将示例中的它们称为 A、B、C)
  • 创建矩阵的副本。
  • 选择 A。从 A 的所有“出点”(至少被一个 0 包围)到其他连接的组件(B,C)执行 BFS。 (当然是最短路径的 BFS)
  • 现在在原始矩阵中,用(比如说)2 标记这些点。
  • 同样使用 B 和 C 重复上述 2 个步骤。如果需要,您可以使用不同的路径标识符填充初始矩阵。 (3 个用于 B,4 个用于 C 等)

现在,将连接的 1 视为节点,将图中的 2、3 等视为边。边缘权重(显然)是从一个节点到另一个节点的 2、3 等的数量。您现在可以使用 Prims 或 Kruskals 算法形成此图的 MST。

对于具有k 1 的连通分量的 (n * n) 矩阵,此算法的复杂度为 O(k * n * n) + O(k * k)。

【讨论】:

  • 什么?对答案的沉默投票毫无意义。如果您曾否决任何答案,请说明原因(除非显而易见)。
猜你喜欢
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2014-01-11
  • 2016-03-09
相关资源
最近更新 更多