【问题标题】:Random Path that covers entire grid覆盖整个网格的随机路径
【发布时间】:2017-10-14 00:01:35
【问题描述】:

我有一个 3 * 3 的网格。我有一个 9 个字母的单词,我必须在网格中随机排列。排列应该是这样的,即网格中有一条有效的路径依次覆盖单词。网格中的有效移动是:上、下、左、右、对角线。无法再次访问相同的元素。

你能指出我正确的方向吗?我只想知道在这种情况下我应该使用什么算法?

抱歉,如果我之前没有说清楚。通过随机排列,我的意思是路径不应该是固定的。

如果我有 BUZZINGLY 这个词,示例路径可以是: | B U Z | |尼兹 | | G L Y | ,所以我选择的任何安排每次都应该不同。

【问题讨论】:

  • arrange randomly 在这种情况下是什么意思?我总是可以说我可以从左到右将字符 1,2,3,6,5,4,7,8,9 分配给方形网格中的字段。然后我总是有一条正确的路径(看起来像一条蛇)。但这是一个微不足道的问题。
  • 对不起,如果我之前不清楚。通过随机排列,我的意思是路径不应该是固定的。如果我有 BUZZINGLY 这个词,示例路径可以是:| B U Z | |尼兹 | | G L Y| ,所以我选择的任何安排每次都应该不同。

标签: algorithm data-structures graph-algorithm


【解决方案1】:

如果您消除对称变体,替代方案并不多,而且也很少。您可以将它们全部计算、存储并随机选择一个。然后选择随机旋转和镜像操作。

为了让您开始,这会考虑 3 个可能的起点:角、中心和中间边缘,并找到所有有效路径。

#include <stdio.h>

int b[3][3];

void print(void) {
  for (int i = 0; i < 3; ++i) printf("%d %d %d\n", b[i][0], b[i][1], b[i][2]);
  printf("\n");
}

void search(int n, int i, int j) {
  if (i < 0 || j < 0 || i > 2 || j > 2 || b[i][j]) return;
  b[i][j] = n;
  if (n == 9) print();
  else {
    search(n + 1, i + 1, j);
    search(n + 1, i - 1, j);
    search(n + 1, i, j + 1);
    search(n + 1, i, j - 1);
    search(n + 1, i + 1, j + 1);
    search(n + 1, i - 1, j + 1);
    search(n + 1, i + 1, j - 1);
    search(n + 1, i - 1, j - 1);
  }
  b[i][j] = 0;
}

int main(void) {
  search(1, 0, 0); search(1, 0, 1); search(1, 1, 1);
  return 0;
}

【讨论】:

  • 嗨基因!感谢你的回复。我无法理解您的解决方案,但这可能是由于我的无能。我会试着理解它。谢谢你的回复。 :)
  • @zeko 您可以在纸上轻松计算出变体。只有 4 个从角落开始,1 个从中间开始,没有一个从中间边缘开始。每个都可以旋转到 4 个位置和/或镜像。每条路径当然是另一条倒退的路径。
  • @m69 是的,我知道。但这其中的乐趣在哪里?这是一个编程社区。而且,如果他接下来想要一张 5x5 的纸,纸会很快填满。
  • 我只是想帮助 zeko 了解您的代码在做什么;这不是批评。
  • 事实上,有中端解决方案。例如,考虑Y L G | I N B | Z Z U。还有一些不仅仅是旋转或反射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多