如何为字符串生成所有可能的(n长度)子集?

时间:2015-09-01 17:50:25

标签: c recursion set combinations permutation

我想暴力攻击解决rubiks立方体的阶段。我有像U(顺时针旋转90度),L,D,F2(180度),B'已经写好了(90度ccw)等,以各种方式模拟立方体所有6个面的旋转。

现在,我想编写一个代码来解决4个问题(不应该超过8个移动长度)。我已经基于人工解决方法编写了它,但它需要太多动作。

如何通过测试n长度的每个可能移动来强制执行此部分,即D L2 RU是4个移动但我希望能够在某个情况需要超过4或5的情况下更改该变量,等

我尝试通过测试所有可能的数字组合进行递归,但我根本没有关闭。

感谢任何帮助/提示。

1 个答案:

答案 0 :(得分:0)

循环通过一组面,然后循环旋转,并将其附加到移动集。您可以按如下方式递归执行:

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);
}