OJ_1120 全排序

来源:互联网 发布:下载360数据恢复软件 编辑:程序博客网 时间:2024/05/22 15:42
#include <iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;const int N=6*5*4*3*2*1+1;char s[7];typedef struct str{        char s[7];}str;str result[N];int cou=0;void swap(int i,int j){     char c=s[i];     s[i]=s[j];     s[j]=c;}void getresult(int len,int st){     if(st==len-1){                // cout<<s<<endl;                //printf("%s\n",s);                strcpy(result[cou++].s,s);                 return;                 }     for(int i=st;i<len;i++)     {             swap(st,i);             getresult(len,st+1);             swap(st,i);     }}bool cmp(str a,str b){    if(strcmp(a.s,b.s)<0)                         return true;    else return false;}void func(){     while(scanf("%s",s)!=EOF)     {                                    int len=strlen(s);               //   sort(s,s+len);                  cou=0;                 getresult(len,0);                 sort(result,result+cou,cmp);                   for (int i = 0; i < cou; i ++) {                    printf("%s\n",result[i].s);                    }                  printf("\n");     }     }char re[7];int visit[7];void dfs(int n,int len){     if(n==len)     {               re[n]='\0';              printf("%s\n",re);              return;        }else     {          for(int i=0;i<len;i++)          {                 if(visit[i]==0)                 {                                re[n]=s[i];                                visit[i]=1;                                dfs(n+1,len);                                visit[i]=0;                 }                             }      }}void init(int n){     for(int i=0;i<n;i++)     {             visit[i]=0;     } }void func1(){     while(scanf("%s",s)!=EOF)     {                                    int len=strlen(s);                  init(len);                  dfs(0,len);                  printf("\n");     }     }int main(int argc, char *argv[]){    //printf("Hello, world\n");func1();return 0;}

SWAP型递归结果顺序不对,需要再排序

用带visit标志进行DFS顺序是正确的


题目描述:

给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。

输入:

输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。

输出:

输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。

样例输入:
abc
样例输出:
abcacbbacbcacabcba
提示:

每组样例输出结束后要再输出一个回车。


0 0