全排列算法

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

 

posted @ 2019-02-20 13:54  Hello_World2020  阅读(203)  评论(0编辑  收藏  举报