随机路径覆盖整个网格

时间:2017-10-14 00:01:35

标签: algorithm data-structures graph-algorithm

我有一个3 * 3网格。我有一个9个字母的单词,我必须在网格中随机排列。该布置应该使得网格中存在有效的路径,该路径顺序地覆盖该单词。网格中的有效移动是:向上,向下,向左,向右,对角线。不能再次访问相同的元素。

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

很抱歉,如果我之前不清楚的话。通过随机排列我的意思是不应修复路径。

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

1 个答案:

答案 0 :(得分: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;
}