【问题标题】: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 个,等等

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

感谢任何帮助/提示。

【问题讨论】:

  • 递归是要走的路。你遇到了什么问题?
  • 你知道有超过 400 亿,十亿的移动可能吗?但他们说,最多需要 20 个——那会更令人满意。 popsci.com/science/article/2010-08/…

标签: 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2021-06-14
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多