美文网首页
全排列问题

全排列问题

作者: darkness605 | 来源:发表于2020-11-06 20:51 被阅读0次

    具体算法流程:
    数列:{1,2,3} 第一个与第一个交换
    可以得到1 {2,3} 将序列{2,3}放进perm函数递归,然后

    ——递归{2,3}
    数列{2,3}第一个与第一个交换
    得到2{3} ,输出1,2,3 (此时low=high,因为序列{3}只有一位数,因此输出列表list)
    数列{2,3}第一个与第一个交换回来,结果仍然是{2,3}
    数列{2,3}第一个与第二个交换
    得到3{2},输出1,3,2
    {3,2}又第一个与第二个交换回来,变回{2,3}
    —–{2,3}递归完毕序列恢复原状{1,2,3}

    数列:{1,2,3} 第一个与第二个交换
    可以得到2,{1,3}
    ——递归{1,3}
    数列{1,3}第一个与第一个交换
    得到1{3} ,输出2,1,3
    数列{1,3}第一个与第一个交换回来,结果仍然是{1,3}
    数列{1,3}第一个与第二个交换
    得到3{1},输出2,3,1
    {3,1}又第一个与第二个交换回来,变回{1,3}
    —–{1,3}递归完毕
    序列{2,1,3}第一个与第二个交换
    序列恢复原状{1,2,3}

    数列:{1,2,3} 第一个与第三个交换
    可以得到3,{1,2}
    ——递归{1,2}
    数列{1,2}第一个与第一个交换
    得到1{2} ,输出3,1,2
    数列{1,2}第一个与第一个交换回来,结果仍然是{1,2}
    数列{1,2}第一个与第二个交换
    得到2{1},输出3,2,1
    {2,1}又第一个与第二个交换回来,变回{1,2}
    —–{1,2}递归完毕
    序列{3,1,2}第一个与第二个交换
    序列恢复原状{1,2,3}

    算法可以简单地写作
    perm({1,2,3})=1perm({2,3})+2perm({1,3})+3perm({1,2})
    perm({2,3})=2perm({3})+3perm({2})
    perm({1,3})=1perm({3})+3perm({1})
    perm({1,2})=1perm({2})+2perm({1})

    代码如下;

    void func(string data,int index)
    {
        if(index == data.length()-1)
        {
            cout << data<<endl;
            return;
        }
    
        for(int i = index;i<data.length();++i){
            swap(data[i], data[index]);
            func(data, index + 1);
            swap(data[i], data[index]);
        }
    
    }
    

    转自:https://blog.csdn.net/a358463121/article/details/45543879?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf

    相关文章

      网友评论

          本文标题:全排列问题

          本文链接:https://www.haomeiwen.com/subject/jcvqbktx.html