第一次尝试
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//在被交换的元素前面序列中,如果出现了这个元素,那么就不必交换了
int judge(int arr[],int i,int k) {
for (; k < i; k++) {
if (arr[k] == arr[i]) {
return 0;
}
}
return 1;
}
int StringRank(int arr[],int k,int n) {
if (k == n) {
for (int i = 0; i <= n; i++) {
printf("%d", arr[i]);
}
printf(" ");
}
else {
for (int i = k; i <= n; i++) {
if (judge(arr, i, k) == 1) {
int t = 0;
t = arr[i]; arr[i] = arr[k]; arr[k] = t;
StringRank(arr, k + 1, n);
t = arr[i]; arr[i] = arr[k]; arr[k] = t;
}
}
}
}
int main() {
/*char arr[10] = { 0 };
printf("输入要输入的字符串个数:\n");
int n = 0;
scanf("%d", &n);
getchar();
printf("输入一串字符串:\n");
for (int i = 0; i < n; i++) {
scanf("%c", &arr[i]);
}*/
/*for (int i = 0; i < n; i++) {
printf("%c", arr[i]);
}*/
int arr[] = { 1,2,3,3 };
StringRank(arr,0,3);
return 0;
}
递归真的是太难了用了,这道题我想了一上午才搞明白,哈哈哈。主要思想是:
- 假设有 {1, 2, 3, … n} 这样一个序列,现在要找出这个序列的全排列,第一位有 n 种可能性,确定了第一位后就是求解剩下 n - 1 个数据的排列问题。这样就可以往下一直分解问题,直到序列结尾处,也就是终止条件。本代码中,还处理了出现重复数字的情况下,保证不会重复输出同一串序列。
另外,本题借鉴了一位大佬的思想,否则可能要花更多的时间。