1、给定一个数组,输出数组元素的所有排列
void generate_permutation(int *arr,int beg,int ed,int len) {
if(beg==ed-1) {
for(int i=0;i<len;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
for(int i=beg;i<ed;i++) {
swap(arr[beg],arr[i]);
generate_permutation(arr,beg+1,ed,len);
swap(arr[beg],arr[i]);
}
}
2.输出数组的所有组合
void combination(int *A,int *B,int beg,int ed,int n,int k) {
if(k==n) {
for(int i=0;i<n;i++)
cout<<B[i]<<" ";
cout<<endl;
}
for(int i=beg;i<ed;i++) {
B[k]=A[i];
combination(A,B,i+1,ed,n,k+1);
}
}
3.随机分配座位数,使得学号相邻的同学座位不相邻
只需要稍微修改一下上面的程序即可
void assignment(int *arr,int beg,int ed,int len) {
int i;
if(beg==ed-1) {
for(i=0;i<len;i++) {
if(arr[i+1]-arr[i]==1 || arr[i]-arr[i+1]==1)
return;
}
for(i=0;i<len;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
for(i=beg;i<ed;i++) {
swap(arr[beg],arr[i]);
assignment(arr,beg+1,ed,len);
swap(arr[beg],arr[i]);
}
}
4.八皇后问题
同样应用上述产生排列的方法
bool check(int *arr,int len) {
for(int i=0;i<len;i++) {
for(int j=i+1;j<len;j++) {
if(abs(arr[j]-arr[i])==j-i)
return false;
}
}
return true;
}
void eight_queen(int *arr,int beg,int ed,int &cnt) {
if(beg==ed-1) {
if(!check(arr,ed))
return;
//print the acceptable answer
cnt++;
for(int i=0;i<ed;i++)
cout<<arr[i]<<" ";
cout<<endl;
}
for(int i=beg;i<ed;i++) {
swap(arr[beg],arr[i]);
eight_queen(arr,beg+1,ed,cnt);
swap(arr[beg],arr[i]);
}
}
5.输出n个元素数组中元素和为m的所有可能
void create_combination(int *A,int *B,int m,int n,int beg,int ed,int k) {
if(m==0) {
for(int i=0;i<k;i++)
cout<<B[i]<<" ";
cout<<endl;
}
if(m<0 || beg>=ed) return;
if(m>0) {
for(int i=beg;i<ed;i++) {
B[k]=A[i];
create_combination(A,B,m-A[i],n,i+1,ed,k+1);
}
}
}