/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num int整型一维数组 
 * @param numLen int num数组长度
 * @return int整型二维数组
 * @return int* returnSize 返回数组行数
 * @return int** returnColumnSizes 返回数组列数
 */

void swap(int* a,int* b){
    int tmp=*a;
    *a=*b;
    *b=tmp;
}

bool shouldskip(int* num,int start,int i){
    for(int j=start;j<i;j++){
        if(num[j]==num[i])return true;
    }
    return false;
}

void backtrack(int* num,int numLen,int n,int* returnsize,int* returnColumnSizes,int** result){
    if(n==numLen){
        result[*returnsize]=malloc(sizeof(int)*numLen);
        returnColumnSizes[*returnsize]=numLen;
        for(int i=0;i<numLen;i++){
            result[*returnsize][i]=num[i];
        }
        (*returnsize)++;
        return;
    }
    for(int i=n;i<numLen;i++){
        if(shouldskip(num,n,i))continue;//检查是否有重复数字比如1.1.2这种
        swap(num+i,num+n);
        backtrack(num,numLen,n+1,returnsize,returnColumnSizes,result);
        swap(num+i,num+n);
    }
}

int** permute(int* num, int numLen, int* returnSize, int** returnColumnSizes ) {
    // write code here
    int n=1;
    //阶乘算出总共有多少种排列组合
    for(int i=1;i<=numLen;i++){
        n=n*i;
    }
    int** result=(int**)malloc(sizeof(int*)*n);
    *returnColumnSizes=malloc(sizeof(int)*n);
    *returnSize=0;
    backtrack(num,numLen,0,returnSize,*returnColumnSizes,result);
    return result;
}