AOJ--字符串全排列

版权声明:本文为博主原创文章,未经博主允许不得转载。可联系邮箱[email protected] https://blog.csdn.net/Justin_bibo/article/details/79861193

##问题
设计算法生成n个元素{r1,r2,…,rn}的全排列。n<=10。按照字典序排列。
##思路
可以将问题递归的看作两个部分:
1、依次将字符串的每一个按顺序一定到第一位,剩下的长度为(n-1)的字符串看作一个新的串
如:abcd
可以有:
a bcd
b acd
c abd
d abc
2、对新串执行步骤1的操作,直到串的最后一位,输出。
并且每一次的递归会破坏字符串的结构,所以每次递归之后需要把字符串交换回来。
##代码

#include<stdio.h>
#include<string.h>
void xunhuanl(char *s,int i,int j)/*循环左移*/
{
    char c;
    int k;
    c=s[j];
    for(k=j-1;k>=i;k--)
    {
        s[k]=s[k+1];
    }
    s[i]=c;

}
void xunhuanr(char *s,int i,int j)/*循环右移*/
{
    char c;
    int k;
    c=s[i];
    for(k=i;k<j;k++)
    {
        s[k+1]=s[k];
    }
    s[j]=c;

}
void f(char *s,int i,int n)
{
    int j;

    if(i==n-1)
    {
        printf("%s\n",s);
        return;
    }
    for(j=i;j<n;j++)
    {
        xunhuanl(s,i,j);
        f(s,i+1,n);
        xunhuanr(s,i,j);
    }


}
int main()
{
    char s[12],c;
    int i,j,n;
    while(~scanf("%s",s))
    {
        n=strlen(s);
        for(i=0;i<n;i++)
            for(j=0;j<=n-i-2;j++)
        {
            if(s[j]>s[j+1])
            {
                exchange(s,j,j+1);
            }
        }
        f(s,0,n);

    }
}


鉏飞祥

猜你喜欢

转载自blog.csdn.net/Justin_bibo/article/details/79861193