zoukankan      html  css  js  c++  java
  • 全排列算法

    一: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.字典排序

  • 相关阅读:
    kafka作业详解(HTML+Nginx+ngx_kafka_module+Kafka)
    Zookeeper知识点总结
    用CocoaPods做iOS程序的依赖管理
    iOS 正则表达式
    iOS 自定义UITabBarController
    iOS 同一UILabel改变数字的颜色
    iOS 自定义字体
    iOS 修改状态条颜色
    iOS 过滤掉HTML标签
    iOS UILabel自适应
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10405617.html
Copyright © 2011-2022 走看看