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

C 如何为字符串生成所有可能的(n长度)子集?,c,recursion,set,combinations,permutation,C,Recursion,Set,Combinations,Permutation,我想用暴力攻击解决rubiks立方体的一个阶段。我已经编写了一些函数,如U(90度顺时针向上旋转dace)、L、D、F2(180度)、B’(90度逆时针旋转)等,它们以各种可能的方式模拟立方体所有6个面的旋转 现在,我想写一个代码来解决4个问题(不应该超过8步)。我已经根据人类的解决方法写了它,但它需要太多的动作 我如何通过测试n长度的每一个可能的移动来强制这一部分,也就是说,D L2 R U是4个移动,但我希望能够在特定情况下改变该变量,以防需要的时间超过4或5,等等 我试着通过测试所有可能的

我想用暴力攻击解决rubiks立方体的一个阶段。我已经编写了一些函数,如U(90度顺时针向上旋转dace)、L、D、F2(180度)、B’(90度逆时针旋转)等,它们以各种可能的方式模拟立方体所有6个面的旋转

现在,我想写一个代码来解决4个问题(不应该超过8步)。我已经根据人类的解决方法写了它,但它需要太多的动作

我如何通过测试n长度的每一个可能的移动来强制这一部分,也就是说,D L2 R U是4个移动,但我希望能够在特定情况下改变该变量,以防需要的时间超过4或5,等等

我试着通过测试所有可能的数字组合来进行递归,但一点也不接近


任何帮助/提示都将不胜感激。

在面集合中循环,然后循环旋转,并将其附加到移动集合中。您可以按如下方式递归执行此操作:

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);
}
charfaces[]={'U','D','L','R','F','B'};
字符旋转[]={'','2','\''};
无效移动(字符移动str[],整数大小,整数计数)
{
int i,j,append;

对于(i=0;i循环遍历面集,然后循环遍历旋转,并将其附加到移动集。可以按如下方式递归执行:

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);
}
charfaces[]={'U','D','L','R','F','B'};
字符旋转[]={'','2','\''};
无效移动(字符移动str[],整数大小,整数计数)
{
int i,j,append;

对于(i=0;i递归是一种方法。你遇到了什么问题?你知道可能有400多亿次移动吗?但他们说,最多需要20次-这会让人更满意。递归是一种方法。你遇到了什么问题?你知道可能有400多亿次移动吗?但是他们说,mAX20是必需的-这将是多么令人满意。