• 全排列算法


    一:Perm算法 递归实现

    #include <iostream>
    #include <cstring>
    using namespace std;
    int sum=0;
    template <class Type> inline void Swap(Type &a, Type &b) {
        Type temp = a; a = b; b = temp;
    }
    template <class Type>
    void Perm(Type list[], int k, int n) {
        if(k == n) {
            for(int i = 0; i <= n; i++) cout << list[i];
            sum++;
            cout << endl;
        }
        else {
            for(int i = k; i <= n; i++) {
                Swap(list[k], list[i]);
                Perm(list, k+1, n);
                Swap(list[k], list[i]);
            }
        }
    }
    
    int main() {
        char s[] = "abcd";
        int len = strlen(s);
        Perm(s, 0, len-1);
        cout<<sum<<endl;
        return 0;
    }
    View Code

    自我实现:

    //全排列算法  Perm算法 
    #include<iostream>
    using namespace std;
    void Perm(string s,int k,int n){
        if(k==n){
            cout<<s<<endl;
        }
        else {
            for(int i=k;i<=n;i++){
                swap(s[k],s[i]);
                Perm(s,k+1,n);
                swap(s[k],s[i]);
            }
        }
    } 
    int main()
    {
        string s;
        cin>>s;
        int len=s.length();
        Perm(s,0,len-1);
    } 
    View Code

    二:深搜实现

    1.数字全排列

    #include <iostream>
    #include <cstring>
    #define MAXN 256
    using namespace std;
    int n;//for dfs_num()
    int perm[MAXN];//全排列
    int visit[MAXN];
    void dfs_num(int step);//数的全排列,step为当前选择元素数量
    int main()
    {
        n = 4;
        memset(visit, 0, sizeof(visit));
        memset(perm, 0, sizeof(perm));
        dfs_num(1);
        return 0;
    }
    /*
     * 数的全排列
     */
    void dfs_num(int step)
    {
        if(step == n+1) {//step到n+1,即已经选满n个数,则深搜结束,得到全排列
            for(int i = 1; i <= n; i++) {
                cout << perm[i] << " ";
            }
            cout << endl;
        }
        else {
            //从1~n中选一个未被选中的元素,然后继续深搜。深搜结束后回溯。
            for(int i = 1; i <= n; i++) {
                if(!visit[i]) {//如果i未被标记
                    perm[step] = i;//记录
                    visit[i] = 1;//标记
                    dfs_num(step+1);//深搜下一步
                    visit[i] = 0;//回溯
                }
            }
        }
    }
    View Code

     自我实现:

    //思路 递归 1--n 字典排序 
    #include<iostream>
    #include<cstring>
    using namespace std;
    int vis[256]={0};
    int a[256]={0};
    int n;
    void gcd(int k){
        if(k==n+1) {
            for(int i=1;i<=n;i++) cout<<a[i];
            cout<<endl;
        }
        else {
            for(int i=1;i<=n;i++){
            if(!vis[i]){
                a[k]=i;
                vis[i]=1;
                gcd(k+1);
                vis[i]=0;
            }
            }
        }
    }
    int main()
    {
        cin>>n;
    //    memset(vis,0,sizeof(vis));
    //    for(int i=1;i<=n;i++) a[i]=i;
        gcd(1);
    }
    View Code

    2.string实现

    //全排列string实现 
    #include<iostream>
    using namespace std;
    int sum=0;
    string s="                  ";
    int vis[1001]={0};
    void gcd(int k,int len,string str){
        if(k==len){
            cout<<s<<endl;
            sum++;
        }
        else {
            for(int i=0;i<len;i++){
                if(!vis[i]) {
                    s[k]=str[i];
    //                cout<<s[k]<<endl;
                    vis[i]=1;
                    gcd(k+1,len,str);
                    vis[i]=0;
                }
            }
        }
    }
    int main()
    {
        string str;
        cin>>str;
        int len=str.length();
    //    s.clear();
        gcd(0,len,str); 
        cout<<sum<<endl;
    }
    View Code

    3.字典排序

  • 相关阅读:
    自定义Hooks:四个典型的使用场景
    FreeSql的各种工程demo上新啦
    萌新看过来,你还学不懂VScode插件吗?
    项目7加法运算前后端分离AspNetMvcApi&Vue实现
    张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用
    task5
    Day09参数+递归
    K8S原来如此简单(四)Service+Ingress
    别再写一堆的 for 循环了!Java 8 中的 Stream 轻松遍历树形结构,是真的牛逼!
    task23
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10405617.html
Copyright © 2020-2023  润新知