题目:打印一维数组的所有组合
解题思路:以数组{1,2,3}为例:
第一步:将{2,3}看成一个整体a,打印出只含有两个元素的数组{1,a},通过交换,有两种组合{1,a}和{a,1};
第二步:在数组{a,1}中,将a中的3和{a,1}中的1看成一个整体b,打印出只含有两个元素的数组{2,b},通过交换,有两种组合{2,b}和{b,2};
第三步:在数组{b,2}中,将b中的1和{b,2}中的2看出一个整体c,打印出只含有两个元素的数组{3,c},通过交换,有两种组合{3,c}和{c,3},其中,{c,3}就是原始数组。
这样,通过交换操作和递归可以打印出指定个数的数组的所有组合,代码如下:
#include <iostream>
using namespace std;
//交换函数
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
void arr_combination(int *arr, int start, int length, int nums){
if (start == length){
for (int i = 0; i <= nums; i++){
cout << arr[i] << " ";
}
cout << endl;
}
else{
for (int j = start; j <= length; j++){
swap(arr[start], arr[j]);
arr_combination(arr, start+1, length, nums);
swap(arr[start], arr[j]);
}
}
}
int main(){
int array[] = {1,2,3};
int length = sizeof(array)/sizeof(int);
arr_combination(array,1,length,1);
system("pause");
return 0;
}
上面是打印出了数组中任意两个数字的所有组合,那么现在来考虑下一维数组的全排列方式,可以在上面的函数中只需定义三个参数,不用指定数字个数,思路是一样的,代码如下:
#include <iostream>
using namespace std;
//交换函数
void swap(int& a, int& b){
int temp = a;
a = b;
b = temp;
}
void arr_combination(int *arr, int start, int length){
if (start == length){
for (int i = 0; i <= length; i++){
cout << arr[i] << " ";
}
cout << endl;
}
else{
for (int j = start; j <= length; j++){
swap(arr[start], arr[j]);
arr_combination(arr, start+1, length);
swap(arr[start], arr[j]);
}
}
}
int main(){
int array[] = {1,2,3,4,5};
int length = sizeof(array)/sizeof(int);
arr_combination(array,0,length-1);
system("pause");
return 0;
}