62 lines
1.4 KiB
C
62 lines
1.4 KiB
C
|
|
#include <stdio.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
|
||
|
|
int bijiao(const void* a, const void* b) {
|
||
|
|
return (*(int*)a - *(int*)b);
|
||
|
|
}
|
||
|
|
|
||
|
|
int used[100];
|
||
|
|
|
||
|
|
void dayi(int *arr, int n) {
|
||
|
|
for (int i = 0; i < n; i++) {
|
||
|
|
printf("%d ", arr[i]); // 添加空格以便于阅读
|
||
|
|
}
|
||
|
|
printf("\n");
|
||
|
|
}
|
||
|
|
|
||
|
|
void pailie(int *arr, int start, int end) {
|
||
|
|
if (start == end) {
|
||
|
|
dayi(arr, end + 1);
|
||
|
|
} else {
|
||
|
|
for (int i = start; i <= end; i++) {
|
||
|
|
// 检查当前元素是否已经使用
|
||
|
|
if (!used[i]) {
|
||
|
|
// 检查前一个元素是否相同且未被使用
|
||
|
|
if (i > start && arr[i] == arr[i - 1] && !used[i - 1]) {
|
||
|
|
continue; // 跳过重复元素
|
||
|
|
}
|
||
|
|
|
||
|
|
used[i] = 1;
|
||
|
|
// 交换元素
|
||
|
|
int t = arr[start];
|
||
|
|
arr[start] = arr[i];
|
||
|
|
arr[i] = t;
|
||
|
|
|
||
|
|
pailie(arr, start + 1, end);
|
||
|
|
|
||
|
|
// 交换回去
|
||
|
|
t = arr[start];
|
||
|
|
arr[start] = arr[i];
|
||
|
|
arr[i] = t;
|
||
|
|
used[i] = 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int main() {
|
||
|
|
int arr[] = {1, 2, 3, 4, 3, 6};
|
||
|
|
int size = sizeof(arr) / sizeof(arr[0]);
|
||
|
|
|
||
|
|
// 排序以方便后续去重
|
||
|
|
qsort(arr, size, sizeof(int), bijiao);
|
||
|
|
|
||
|
|
// 初始化使用标记数组
|
||
|
|
for (int i = 0; i < size; i++) {
|
||
|
|
used[i] = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
pailie(arr, 0, size - 1);
|
||
|
|
return 0;
|
||
|
|
}
|