weinan030416

导航

递归求字符全排列

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=10;
char n[N];
char path[N];
bool used[N];

void dfs(int u)
{
    if(u==strlen(n))
    {
        for(int i=0;i<strlen(n);i++)    cout<<path[i];
        cout<<endl;
        return;
    }
    for(int i=0;i<strlen(n);i++)
    {
        if(!used[i])
        {
            path[u]=n[i];
            cout<<"path["<<u<<"]"<<"=n["<<i<<"]"<<endl;
            used[i]=true;
            cout<<"used["<<i<<"]=true"<<endl;
            dfs(u+1);
            used[i]=false;
            cout<<"used["<<i<<"]=false"<<endl;
        }
        else
        {
            cout<<n[i]<<"已经使用了"<<endl;
        }
    }
}

int main()
{
    cin>>n;
    sort(n,n+strlen(n));
    dfs(0);
    return 0;
}

输入abc

输出结果

path[0]=n[0]
used[0]=true
a已经使用了
path[1]=n[1]
used[1]=true
a已经使用了
b已经使用了
path[2]=n[2]
used[2]=true
abc
used[2]=false
used[1]=false
path[1]=n[2]
used[2]=true
a已经使用了
path[2]=n[1]
used[1]=true
acb
used[1]=false
c已经使用了
used[2]=false
used[0]=false
path[0]=n[1]
used[1]=true
path[1]=n[0]
used[0]=true
a已经使用了
b已经使用了
path[2]=n[2]
used[2]=true
bac
used[2]=false
used[0]=false
b已经使用了
path[1]=n[2]
used[2]=true
path[2]=n[0]
used[0]=true
bca
used[0]=false
b已经使用了
c已经使用了
used[2]=false
used[1]=false
path[0]=n[2]
used[2]=true
path[1]=n[0]
used[0]=true
a已经使用了
path[2]=n[1]
used[1]=true
cab
used[1]=false
c已经使用了
used[0]=false
path[1]=n[1]
used[1]=true
path[2]=n[0]
used[0]=true
cba
used[0]=false
b已经使用了
c已经使用了
used[1]=false
c已经使用了
used[2]=false

 

 

如果每个字母可以重复使用

 

#include<iostream>
#include<cstring>
using namespace std;

char path[10];
char t[10];

void dfs(int n,int l)
{
    if(n==l)
    {
        n=0;
        cout<<path<<endl;
        return;
    }
    
    for(int i=0;i<l;i++)
    {
        path[n]=t[i];
        dfs(n+1,l);
    }
}

int main()
{

    cin>>t;
    dfs(0,strlen(t));
}

 

posted on 2023-01-18 12:20  楠030416  阅读(11)  评论(0编辑  收藏  举报