- 题目描述:
-
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
- 输入:
-
每个测试案例包括1行。
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
- 输出:
-
对应每组数据,按字典序输出所有排列。
- 样例输入:
-
abc BCA
- 样例输出:
-
abc acb bac bca cab cba ABC ACB BAC BCA CAB CBA
休息了三天,今天重新开始做题。这道题用回溯法可解,代码如下:1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <string> 5 #include <algorithm> 6 7 #define MAX 12 8 char temp[MAX]; 9 char toP[MAX]; 10 bool flag[MAX]; 11 12 int cmp(const void *a, const void *b) { 13 char at = *(char *)a; 14 char bt = *(char *)b; 15 return at - bt; 16 } 17 18 void dfs(int len, int n) { 19 if(n == len) { 20 printf("%s ",toP); 21 return; 22 } 23 for(int i = 0; i < len; i++) { 24 if(toP[n] == temp[i]) { 25 continue; 26 } 27 if(flag[i] == false) { 28 toP[n] = temp[i]; 29 flag[i] = true; 30 dfs(len, n+1); 31 flag[i] = false; 32 for(int j = n+1; j < len; j++) { 33 toP[j] = '-'; 34 } 35 } 36 } 37 } 38 39 int main(int argc, char const *argv[]) 40 { 41 while(scanf("%s",temp) != EOF) { 42 int len = strlen(temp); 43 qsort(temp, len, sizeof(char),cmp); 44 for(int i = 0; i < len; i++) { 45 flag[i] = false; 46 toP[i] = '-'; 47 } 48 toP[len] = '