如何为字符串生成所有可能的(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高度?