poj1731 - Orders

来源:互联网 发布:win7下怎么卸载Ubuntu 编辑:程序博客网 时间:2024/06/05 22:15

                                    想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410
                                     转载请注明出处:
http://blog.csdn.net/wangjian8006

题目大意:给出一个字符串,字符串不超过200位,问这个字符串的所有全排列,不过这个字符串里面是有重复的


解题思路:因为字符串是无序的,所以首先要把输入的字符串按小到大去排序,和经典全排列不同的是他有重复的字母,那么我们在递归的时候需要处理一下,就是本次递归的字母不用上次选的字母,根据一个这样的处理就可以避免重复的排列出现

 

#include <iostream>#include <algorithm>using namespace std;#define MAXV 210int t,a[MAXV];char s[MAXV],pr[MAXV];void pl(int cap){    char c=0;    int j;    if(cap==t){        printf("%s\n",pr);        return ;    }    for(j=0;j<t;j++){        if(!a[j] && c!=s[j]){            pr[cap]=c=s[j];            a[j]=1;            pl(cap+1);            a[j]=0;        }    }}int main(){    while(gets(s)){        memset(a,0,sizeof(a));        t=strlen(s);        pr[t]='\0';        sort(s,s+strlen(s));        pl(0);    }    return 0;}


 

原创粉丝点击