#include
#include
//排列数问题
/*
如[1,2,3]的所有全排列结果为
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
总的排列数量为 3!个
*/
//法一:交换位置法
void swap(int *a , int *b){
int temp = *a;
*a = *b;
*b = temp;
}
void printArr(int *arr , int n){
int i;
for(i = 0; i < n; i++){
printf("%d\t", arr[i]);
}
putchar('\n');
}
void perm1(int *arr, int n , int index){
if(index == n){
printArr(arr , n);
return ;
}
int i;
for(i = index; i < n; i++){
swap(&arr[index] , &arr[i]);
perm1(arr , n , index + 1);
swap(&arr[index] , &arr[i]);
}
}
//法二:存储节点法
void perm2(int *arr , int n , int *list , int *listCounts , int *visited){
if(*listCounts == n){
printArr(list , *listCounts);
}
int i;
for(i = 0; i < n; i++){
if(!visited[i]){
list[(*listCounts)++] = arr[i];
visited[i] = 1;
perm2(arr , n , list , listCounts , visited);
visited[i] = 0;
(*listCounts)--;
}
}
}
void test1(){
int arr[] = {1 , 2 , 3};
perm1(arr , sizeof(arr) / sizeof(arr[0]) , 0);
}
void test2(){
int arr[] = {1 , 2 , 3 ,4};
int *visited = (int *)malloc(sizeof(int) * (sizeof(arr) / sizeof(arr[0])));
int *list = (int *)malloc(sizeof(int) * (sizeof(arr) / sizeof(arr[0])));
int i;
int count = 0;
for(i = 0; i < sizeof(arr) / sizeof(arr[0]) ; i++){
visited[i] = 0;
}
perm2(arr , sizeof(arr) / sizeof(arr[0]) , list , &count , visited);
}
//子集树问题
/*
[1,2,3]的子集有[][1][2][3][1,2][1,3][2,3][1,2,3]这8个
C(3,0) + C(3 , 1) + C(3 , 2) + C(3 , 3) = 8;
*/
void subTreeProblem(int *arr , int n , int *list , int *countOfList , int index){
if(*countOfList == n){
return;
}
int i;
for(i = index; i < n; i++){
list[(*countOfList)++] = arr[i];
printArr(list , *countOfList);
subTreeProblem(arr , n , list , countOfList , i + 1);
(*countOfList)--;
}
}
void test3(){
int arr[] = {1 , 2 , 3 , 4};
int *list = (int *)malloc(sizeof(int) * (sizeof(arr) / sizeof(arr[0])));
int count = 0;
subTreeProblem(arr , sizeof(arr) / sizeof(arr[0]) , list , &count , 0);
}
int main(void){
test3();
return 0;
}