问题描述:
以下AC代码有详细解释!!!
输出排列、组合的基本序列,两种语言java、c++,两种方式,java采用比较原始的方法,c++采用深搜,基本原理相差不大,个人感觉c++更好使用和理解!
全排列(c++):
#include<bits/stdc++.h>
using namespace std;
//输入n,对n个数进行全排列,输出排列顺序
//全局变量
int n;
int a[105]; //放置元素
int flag[105];
//打印函数
void show(){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
//深搜
void dfs(int i){
if(i>n){
show();
return;
}
else{
for(int j=1;j<=n;j++){ //对每个分支进行遍历判断
if(flag[j]==0){ //此数字还没有被使用
a[i]=j;
flag[j]=1;
dfs(i+1);
flag[j]=0; //回溯
}
}
}
}
//主函数
int main(){
cin>>n;
dfs(1);
return 0;
}
组合(c++):
#include<bits/stdc++.h>
using namespace std;
//组合问题,n个数选出k个数,输出
/*思想:
首先选出最后一个数,即选出最后一个数最大值
然后进行递归,选出次大值
*/
//全局变量
int n;
int k;
int a[105];
//打印函数
void show(){
for(int i=1;i<=k;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
//递归函数
void fun(int n,int k){
if(k==0){
show();
return;
}
else{
for(int i=k;i<=n;i++){
a[k]=i;
fun(i-1,k-1);
}
}
}
//主函数
int main(){
cin>>n;
cin>>k;
fun(n,k);
return 0;
}
全排列(java):
import java.util.*;
//全排列问题,求解全排列个数
public class Test2 {
// 统计全排列的个数
public static int count=0;
// 全排列的数组
public static int[] arr=new int[] {8,9,7,3,4,5,2,1,33,24};
// 交换两个数的值
public static void swap(int a,int b) {
int temp=a;
a=b;
b=temp;
}
// 递归函数体
public static void perm(int begin,int end) {
if(begin==end) {
count++;
}
else {
for(int i=begin;i<=end;i++) {
swap(arr[begin],arr[i]); //与后面的十个数交换位置
perm(begin+1,end); //除去第一位数值对后面的n-1位数进行全排列
swap(arr[begin],arr[i]); //恢复数值,用于下一次交换
}
}
}
public static void main(String[] args) {
perm(0,9);
System.out.println(count);
}
}
组合(java):
import java.util.*;
//排列问题,m个小球取n个
public class Test3 {
// 定义组合数量
public static int count=0;
// 定义栈用于存放小球
public static Stack<Integer> s=new Stack<Integer>();
// 用于记录是否已被取走
public static boolean[] flag=new boolean[10];
// 递归函数体
public static void perm(int minv,int maxv,int curnums,int maxnums ) {
// minv:可开始抓取最小小球编号
// maxv:可开始抓取最大小球编号
// curnums:当前抓取的小球数目
// maxnums:题目要求抓取的小球数目
if(curnums==maxnums) {
System.out.println(s);
count++;
return;
}
else {
for(int i=minv;i<=maxv;i++) {
if(!flag[i]) {
s.push(i);
flag[i]=true;
perm(minv,maxv,curnums+1,maxnums);
flag[i]=false;
s.pop();
}
}
}
}
public static void main(String[] args) {
perm(1,8,0,4);
System.out.println(count);
}
}