/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型一维数组
* @param numLen int num数组长度
* @return int整型二维数组
* @return int* returnSize 返回数组行数
* @return int** returnColumnSizes 返回数组列数
*/
#include <stdio.h>
#include <malloc.h>
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void re_permute(int* num, int index, int numLen, int* returnSize, int** returnColumnSizes, int** res) {
int i = 0;
// 索引到最后一位的时候,将num数组赋值给当前行数组
if(index == numLen) {
res[*returnSize] = (int*)malloc(numLen * sizeof(int));
for(int i = 0; i < numLen; i++) {
res[*returnSize][i] = num[i];
}
(*returnColumnSizes)[*returnSize] = numLen;
(*returnSize)++;
}
for(i = index; i < numLen; i++) {
swap(&num[i], &num[index]);
if((numLen - index) > 2 && index != i) {
swap(&num[i], &num[index + 1]);
re_permute(num, index + 1, numLen, returnSize, returnColumnSizes, res);
swap(&num[i], &num[index + 1]);
} else {
re_permute(num, index + 1, numLen, returnSize, returnColumnSizes, res);
}
swap(&num[i], &num[index]);
}
}
int** permute(int* num, int numLen, int* returnSize, int** returnColumnSizes ) {
// write code here
if(numLen == 0) {return NULL;}
int i = 1;
int count = 1;
for(; i <= numLen; i++) {
count *= i;
}
*returnColumnSizes = (int*)malloc(count * sizeof(int));
int** res = (int**)malloc(count * sizeof(int*));
*returnSize = 0;
re_permute(num, 0, numLen, returnSize, returnColumnSizes, res);
return res;
}