一、题目:
输入一个字符串,字母按照顺序递增,要求输出所有的排序
输入用例:
abc
ab
输出用例:
abc
acb
bac
bca
cab
cba
ab
ba
二、思路:
三、代码:
#include<stdio.h>
#include<stdlib.h>
void printfAllPossible(char a[], char tidy[], int deep);
int main(void)
{
char a[100];
scanf("%s", &a);
char except[100]; //除了即将输出的首字母以外别的字母
char fixed[100]; //固定即将输出的首字母
int deep = 1; //递归层数
printf("result:\n");
for (int i = 0; i < strlen(a); i++) //eg. 如果排列为 abcde 且输出第一个为 a, 则fixed数组放了a, except数组放了bcde
{
fixed[0] = a[i]; //fixed数组放即将输出的首字母
fixed[1] = '\0';
except[0] = '\0'; //except数组存放“除了即将输出的首字母以外别的字母”
int count = 0;
for (int j = 0; j < strlen(a); j++)
{
if (j != i)
{
except[count] = a[j];
count++;
}
}
except[count] = '\0';
printfAllPossible(except, fixed, deep); //开始递归
}
}
void printfAllPossible(char a[], char fixed[], int deep)
{
if (strlen(a) == 1) //递归出口:只剩下一个字母后,输出fixed数组里的数字,并输出最后一个字母。
{ //并返回上一层,返回上一层不要忘了将fixed数组中最后一个字母删除
printf("%s", fixed);
printf("%c\n", a[0]);
int len = strlen(fixed);
fixed[len - 1] = '\0';
return;
}
for (int i = 0; i < strlen(a); i++) //每次递归fixed多一个字母,except少一个字母
{
int len = strlen(fixed);
fixed[len] = a[i];
fixed[len + 1] = '\0';
char except[100];
int count = 0;
for (int j = 0; j < strlen(a); j++)
{
if (j != i)
{
except[count] = a[j];
count++;
}
}
except[count] = '\0';
printfAllPossible(except, fixed, deep+1); //层数+1
if (deep < strlen(fixed)) //非常重要!
{
fixed[deep] = '\0';
}
}
}
四、做法二
参考:https://blog.csdn.net/sdut_jk17_zhangming/article/details/79619051
#include <stdio.h>
#include <string.h>
char s[100];
char s_visited[100];
int visited[100];
void quanpailie(int already_visit_count, int N)
{
if (already_visit_count == N)
{
for (int i = 0; i < N; i++)
{
printf("%c", s_visited[i]);
}
printf("\n");
return;
}
for (int i = 0; i < N; i++)
{
if (!visited[i])
{
visited[i] = 1;
s_visited[already_visit_count] = s[i];
quanpailie(already_visit_count+1, N);
visited[i] = 0;
}
}
}
int main(void)
{
int N;
scanf("%s", s);
N = strlen(s);
for (int i = 0; i < N; i++)
{
visited[i] = 0;
}
quanpailie(0, N);
}