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

Posted

技术标签:

【中文标题】如何为字符串生成所有可能的(n 长度)子集?【英文标题】:How can I generate all possible (n-length) subsets for a string? 【发布时间】:2015-11-27 01:34:25 【问题描述】:

我想暴力破解一个阶段解决魔方。我已经编写了 U(顺时针旋转 90 度)、L、D、F2(180 度)、B'(逆时针 90 度)等函数,它们可以模拟立方体所有 6 个面的旋转。方式。

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

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

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

感谢任何帮助/提示。

【问题讨论】:

递归是要走的路。你遇到了什么问题? 你知道有超过 400 亿,十亿的移动可能吗?但他们说,最多需要 20 个——那会更令人满意。 popsci.com/science/article/2010-08/… 【参考方案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);

【讨论】:

以上是关于如何为字符串生成所有可能的(n 长度)子集?的主要内容,如果未能解决你的问题,请参考以下文章

如何为android recyclerview中的最大字符串设置textview高度?

如何为android中的字符串输入生成唯一的哈希码...?

新的 Firebase Firestore DocumentDb 如何为大型子集合建模

如何为 SQL 表自动生成数据类型

从给定的字母生成所有长度为 n 的字符串 [关闭]

如何为 Swift UI 的字符添加最大长度