全排列程序

排列:一些元素按某种顺序排成一列即为这些元素的一个排列。例如:由1,2,3,4,5组成一排列可以有12345,31254等。

全排列:一些元素的所有可能的排列。例如:由a,b,c三个字母的全排列为abc,acb,bac,bca,cab,cba六个排列

求全排列的问题可以用递归,也可以用非递归形式。

/*功能:根据输入字符串列全排列
说明1:所用字符为所有可见字符
说明2:区分大小写
说明3:所有字符不重复使用(输入字符串可以重复)
说明4:全排列按字符顺序升序排列*/
#include<iostream>
#include<cstring>
using namespace std;
const int N=20;
bool mak[N],m;
int a[127],num[N],cnt,no,tmp; 
char f[N];
void pr()
{
    cout<<++no<<':'; 
    for(int k=1;k<=cnt;k++)cout<<f[num[k]];
    cout<<endl; 
}
int main()
{
    ios::sync_with_stdio(0);
    int i;
    string s;
    cin>>s;
    for(i=0;i<s.length() ;i++)a[s[i]]=1;
    for(i=33;i<127;i++)if(a[i])f[++cnt]=i;
    for(i=1;i<=cnt;i++)num[i]=i;
    pr();
    tmp=cnt;
    do
    {
        mak[num[tmp]]=true;
        for(i=num[tmp]+1;i<=cnt;i++)
            if(mak[i])
            {
                num[tmp]=i,mak[i]=false;
                break;
            }
        if(i>cnt)tmp--;
        else 
        {
            for(i=tmp+1;i<=cnt;i++)
                for(int j=1;j<=cnt;j++)
                    if(mak[j])
                    {
                        num[i]=j,mak[j]=false;
                        break;
                    }
            pr();
            tmp=cnt;
        }
    }while(tmp);
    return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
int a[27],num[20],mk[20],cnt=0,x,js;
char  f[20];
void pr()
{
    cout<<++js<<':';
    for(int i=1;i<=cnt;i++)cout<<f[num[i]];
    cout<<endl;
    return;
}
void dfs(int dp)
{
    if(dp==cnt+1)pr();
    else
    for(int i=1;i<=cnt;i++)
    {
        if(mk[i]==0)
        {
            num[dp]=i,mk[i]=1;
            dfs(dp+1);
            mk[i]=0;
        }        
    }
}
int main()
{
    ios::sync_with_stdio(0);
    char ch;
    string s; 
    cin>>s;
    for(int i=0;i<s.length() ;i++)
    {
        ch=s[i];
        if(ch>'Z')ch-=32;
        x=ch-'A'+1;
        a[x]=1;
    }
    for(int i=1;i<=26;i++)if(a[i])f[++cnt]=i+'A'-1;
    dfs(1);
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wendcn/p/12381543.html