我有一个3 * 3网格。我有一个9个字母的单词,我必须在网格中随机排列。该布置应该使得网格中存在有效的路径,该路径顺序地覆盖该单词。网格中的有效移动是:向上,向下,向左,向右,对角线。不能再次访问相同的元素。
你能指出我正确的方向吗?我只是想知道在这种情况下我应该使用什么算法?很抱歉,如果我之前不清楚的话。通过随机排列我的意思是不应修复路径。
如果我有BUZZINGLY这个词,示例路径可以是: | B U Z | | N I Z | | G L Y | 所以我选择的任何安排每次都应该是不同的。
答案 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;
}