返回题解分享
讨论 / 题解分享/ 帖子详情

部分元素排列 - 题解

求组合实际上可以不用标记走过,可以利用下标来,往后走就是

#include<cstdio>
#include<iostream>
#include<algorithm> 
using namespace std;
int num[12];
int mstate[12];
int n,r;
void dfs(int top,int numi){
	if(top==r){
		for(int k=0;k<top-1;++k) cout<<mstate[k]<<" ";
		cout<<mstate[top-1]<<endl;
		return;
	}

	for(int i=numi;i<n;i++){
		mstate[top]=num[i];
		dfs(top+1,i+1);
	}
	return;
}
int main(){

	cin>>n>>r;
	for(int i=0;i<n;i++) cin>>num[i];
	sort(num,num+n);
	dfs(0,0);	
	return 0;
	
}


顺便写了个组合并且全排列,这时候就需要flag记录了

#include<cstdio>
#include<iostream>
#include<algorithm> 
using namespace std;
int num[12];
int flag[12];
int mstate[12];
int n,r;
int mcount=0;
void dfs(int top){
	if(top==r){
		for(int k=0;k<top-1;++k) cout<<mstate[k]<<" ";
		cout<<mstate[top-1]<<endl;
		mcount++;
		return;
	}

	for(int i=0;i<n;i++){
		if(flag[i]!=1){
		
		mstate[top]=num[i];
		flag[i]=1;
		dfs(top+1);
		flag[i]=0;
		}
	}
	return;
}
int main(){

	cin>>n>>r;
	for(int i=0;i<n;i++) cin>>num[i];
	sort(num,num+n);
	dfs(0);
	cout<<mcount;	
	return 0;
	
}
0 回复 0 转发 0 喜欢 3 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!