Chinaunix首页 | 论坛 | 博客
  • 博客访问: 342916
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1191
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 11:12
文章分类

全部博文(122)

文章存档

2010年(122)

我的朋友

分类: C/C++

2010-05-04 19:34:10

一、问题描述

大意是求出一个字符集的全排列,不能有相同的,并按字典顺序输出所有排列

Sample Input

bbjd

Sample Output

bbdj
bbjd
bdbj
bdjb
bjbd
bjdb
dbbj
dbjb
djbb
jbbd
jbdb
jdbb

 

二、解题思路

利用递归回溯求解,先将字符从小到大进行排序。然后使用回溯法。因为不能有相同的排列,故在回溯时如果下一个字符和上一个字符相同,则跳过该字符直到一个不同的字符。

三、代码

 

#include<iostream>
using namespace std;
char s[205];
char res[205];
bool b[205];
int N;
int cmp(const void * a,const void * b)
{
    return *(char * )a-*(char *)b;
}
void backtrace(int n)
{
    if(n==N)
    {
        printf("%s\n",res);
        return ;
    }
    int i;
    for(i=0;i<N;++i)
    {
        if(b[i]==false)
        {
            res[n]=s[i];
            b[i]=true;
            backtrace(n+1);
            b[i]=false;
            while(i<(N-1) && s[i]==s[i+1])//跳过相同的字符
                i++;
        }    
    }
}
int main()
{
    scanf("%s",&s);
    N=strlen(s);
    res[N]='\0';
    qsort(s,N,sizeof(char),cmp);
    memset(b,0,sizeof(b));
    backtrace(0);
    return 0;
}


阅读(1209) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~