1199:全排列
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
我们假设对于小写字母有‘a’ <‘b’ < ... <‘y’<‘z’,而且给定的字符串中的字母已经按照从小到大的顺序排列。
【输入】
只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
【输出】
输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
已知S=s1s2...sk,T=t1t2...tk,则S<T等价于,存在p(1≤p≤k),使得s1=t1,s2=t2,...,s(p−1)=t(p−1),sp<tp成立。
【输入样例】
abc
【输出样例】
abc
acb
bac
bca
cab
cba
【提示】
本题目禁止使用STL及包含可以使用的相关调用。
【来源】
No
1. #include<stdio.h> 2. #include<iostream> 3. #include<cstring> 4. using namespace std; 5. bool b[1001];//标记 6. char s[1001],as[1001]; //s存储原字符串 as存储排序方案 7. int len; 8. void dfs(int i) 9. { 10. for(int j=0;j<len;j++){ 11. if(!b[s[j]]){//判断是否用过 12. b[s[j]]=1; 13. as[i]=s[j]; 14. if(i==len-1) printf("%s\n",as);//长度达到输出 15. else dfs(i+1);//否则取下一个长度 16. b[s[j]]=0;//标记取消 17. } 18. } 19. } 20. int main() 21. { 22. scanf("%s",s); 23. len=strlen(s); 24. dfs(0);//从长度0开始搜索 25. return 0; 26. }
1. #include<stdio.h> 2. #include<iostream> 3. #include<cstring> 4. using namespace std; 5. char a[1001]; 6. int b[1001],c[1001]={0}; 7. int len; 8. void dfs(int n) 9. { 10. if(n==len){ 11. for(int i=0;i<len;i++) cout<<a[b[i]]; 12. cout<<endl; 13. } 14. for(int i=0;i<len;i++){ 15. if(!c[i]){//判断是否用过 16. c[i]=1; 17. b[n]=i; 18. dfs(n+1);//取下一个长度 19. c[i]=0;//标记取消 20. } 21. } 22. } 23. int main() 24. { 25. scanf("%s",a); 26. len=strlen(a); 27. dfs(0);//从长度0开始搜索 28. return 0; 29. }