回溯算法入门(排列树问题 + 子集树问题)

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

你可能感兴趣的:(算法)