#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;
}
