全排列算法

一:Perm算法 递归实现

#include <iostream>
#include <cstring>
using namespace std;
int sum=0;
template <class Type> inline void SwapType &a, Type &b) {
    Type temp = a; a = b; b = temp;
}
template <class Type>
void PermType list[], int k, int n) {
    ifk == n) {
        forint i = 0; i <= n; i++) cout << list[i];
        sum++;
        cout << endl;
    }
    else {
        forint i = k; i <= n; i++) {
            Swaplist[k], list[i]);
            Permlist, k+1, n);
            Swaplist[k], list[i]);
        }
    }
}

int main) {
    char s[] = "abcd";
    int len = strlens);
    Perms, 0, len-1);
    cout<<sum<<endl;
    return 0;
}

View Code

自我实现:

//全排列算法  Perm算法 
#include<iostream>
using namespace std;
void Permstring s,int k,int n){
    ifk==n){
        cout<<s<<endl;
    }
    else {
        forint i=k;i<=n;i++){
            swaps[k],s[i]);
            Perms,k+1,n);
            swaps[k],s[i]);
        }
    }
} 
int main)
{
    string s;
    cin>>s;
    int len=s.length);
    Perms,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_numint step);//数的全排列,step为当前选择元素数量
int main)
{
    n = 4;
    memsetvisit, 0, sizeofvisit));
    memsetperm, 0, sizeofperm));
    dfs_num1);
    return 0;
}
/*
 * 数的全排列
 */
void dfs_numint step)
{
    ifstep == n+1) {//step到n+1,即已经选满n个数,则深搜结束,得到全排列
        forint i = 1; i <= n; i++) {
            cout << perm[i] << " ";
        }
        cout << endl;
    }
    else {
        //从1~n中选一个未被选中的元素,然后继续深搜。深搜结束后回溯。
        forint i = 1; i <= n; i++) {
            if!visit[i]) {//如果i未被标记
                perm[step] = i;//记录
                visit[i] = 1;//标记
                dfs_numstep+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 gcdint k){
    ifk==n+1) {
        forint i=1;i<=n;i++) cout<<a[i];
        cout<<endl;
    }
    else {
        forint i=1;i<=n;i++){
        if!vis[i]){
            a[k]=i;
            vis[i]=1;
            gcdk+1);
            vis[i]=0;
        }
        }
    }
}
int main)
{
    cin>>n;
//    memsetvis,0,sizeofvis));
//    forint i=1;i<=n;i++) a[i]=i;
    gcd1);
}

View Code

2.string实现

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

View Code

3.字典排序

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注