一、全排列
我理解全排列的思想就是:一个数组每次都把位于第一的元素拿出与它之后的每一个元素交换,确保每个元素都有机会做当前排列的第一位,再对除此位之外的后面所有元素进行子数组的全排列,依次递归,直到该元素之后没有元素了就一次输出这个被交换好的数列
#include<iostream>
using namespace std;
template<typename T>
void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}
//template<typename T>
void f(int *a,int start,int stop){
//start为全排列的起始位置
if(start==stop){
//已经到了数组最后一位元素
cout<<"{";
for(int i=0;i<stop;i++){
cout<<a[i];
}
cout<<"}";
}else{
for(int i=start;i<stop;i++){
//与第一位的元素交换
swap(a[i],a[start]);
//递归对交换之后a[i]后的元素全排列
f(a,start+1,stop);
//把交换的元素换回来保持数组顺序不变,为下一次交换做准备
swap(a[i],a[start]);
}
}
}
int main(){
int a[3]={1,2,3};
f(a,0,3);
}
运行结果如下:
二、数组的子集
思路:数组里的每个元素对于自己来说都只有两种状态:0代表不在该子集 1代表在该子集,从数组的第一个元素开始都分别以两种状态去组合它之后的元素,如图:
每次以开始元素往后递归0、1两种情况,最后把状态1的显示出来即可`
//已经到数组的最后一位
cout<<"{";
for(int i=0;i<stop;i++){
if(mark[i]==1){
cout<<a[i];
}
}
cout<<"}";
}else{
mark[start]=0;
f(a,mark,start+1,stop);
mark[start]=1;
f(a,mark,start+1,stop);
}
}
int main(){
char str[3]={'a','b','c'};
int mark[3];
f(str,mark,0,3);
}
运行结果如下: