正文

有重复元素的全排列输出2007-04-07 15:01:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yzfy/24672.html

分享到:

例如,输入aabc,按字典顺序输出:
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa

偶的代码如下:
#include <stdio.h>
int main()
{
    long nt,n1,n2,nLen;
    char cIn[100],ct;
    long nNum[100]={0};
    scanf("%s",cIn); //输入字符串
    {
        char *pc=cIn,*pc2;
        for(;*pc;pc++)for(pc2=pc+1;*pc2;pc2++)//排序,按ASCII
            if(*pc>*pc2)ct=*pc,*pc=*pc2,*pc2=ct;
        nLen=pc-cIn;
        while(nNum[nLen]==0)
        {
            char cT[100],cOut[100]={0},*pcOut=cOut;
            for(n1=0;n1<=nLen;n1++)cT[n1]=cIn[n1]; //取数初始化
            for(n1=0;n1<nLen;n1++)
            {
                n2=nNum[nLen-n1-1]; //按排列数取数
                if(n2>0 && cT[n2]==cT[n2-1])break; //防重复
                *pcOut++=cT[n2];
                for(nt=n2;nt<nLen;nt++)cT[nt]=cT[nt+1]; //删除已取元素
            }
            if(n1==nLen)printf("%s\n",cOut); //输出
            long *pn=nNum+1;
            for((*pn)++,n1=1;n1<nLen;n1++) //不等进制数加一并处理进位
                if(*pn>n1)*pn++=0,(*pn)++;else break;
        }
    }
    return 0;
}

阅读(6912) | 评论(14)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册