【问题标题】:How can I generate all possible (n-length) subsets for a string?如何为字符串生成所有可能的(n 长度)子集?
【发布时间】:2015-11-27 01:34:25
【问题描述】:
我想暴力破解一个阶段解决魔方。我已经编写了 U(顺时针旋转 90 度)、L、D、F2(180 度)、B'(逆时针 90 度)等函数,它们可以模拟立方体所有 6 个面的旋转。方式。
现在,我想编写一个代码来解决 4 个棋子(不应该超过 8 个动作)。我已经根据人类解决方法编写了它,但是它需要太多动作。
我如何通过测试 n 长度的每一个可能的移动来强制这部分,即 D L2 RU 是 4 个移动,但我希望能够更改该变量以防某种情况需要超过 4 或 5 个,等等
我尝试通过测试所有可能的数字组合来进行递归,但我一点也不接近。
感谢任何帮助/提示。
【问题讨论】:
标签:
c
recursion
set
combinations
permutation
【解决方案1】:
遍历一组面,然后循环旋转,并将其附加到您的移动集。您可以递归地执行以下操作:
char faces[] = { 'U','D','L','R','F','B' };
char rotation[] = { ' ', '2', '\'' };
void move(char movestr[], int size, int count)
{
int i, j, append;
for (i=0;i<sizeof(faces);i++) {
for (j=0;j<sizeof(rotation);j++) {
append=0;
movestr[size+(append++)] = faces[i];
if (j != 0) movestr[size+(append++)] = rotation[i];
movestr[size+(append++)] = ' ';
movestr[size+append] = '\0';
if (count > 0) {
move(movestr, size+append, count-1);
} else {
// try move
}
}
}
}
int main()
{
char movestr[100];
move(movestr, 0, 4);
}