作业介绍

#include <iostream> 
using namespace std;

// 从n个数中选k个数全排(组合)
int n,k;
int res[15];  // 答案数字
bool vis[15]; // 标记数组,0表示没被选过,1表示被选

// 函数作用:表示当前选的是第几个数(总共要选k个数)
void dfs(int x){
	// 当前选的数超过k个,就结束搜索(x等于k,即dfs(k)表示选第k个数)
	if(x>k){
		// 输出答案,有k个数字所以要用循环
		for(int i=1;i<=k;i++){
			cout<<res[i]<<" ";
		}
		cout<<endl;
		return;
	}
	// 从1~n个数中选
	for(int i=1;i<=n;i++){
		// 全排列:没有数字大小限制,只有一个条件:数字没被选过即可
		// if(vis[i] != 1){
		
		// 组合:数字没被选过 && 当前选的数字不能小于前一个数字
                // 也就是说,1 2 3 和 2 3 1是一种方案
		if(vis[i] != 1 && res[x-1]<i){

			res[x] = i;  // 把这个数字记录到答案数组中
			vis[i] = 1;  // 标记这个数字,后面的搜索中不能再选了
			dfs(x+1);    // 递归搜索下一个数字
			vis[i] = 0;  // 回溯,本次搜索完后,后续的其他搜索中也可能有这个数字
		}
	}
}

int main(){
	cin>>n>>k;
	dfs(1);
	return 0; 
}

状态
已结束
题目
6
开始时间
2025-3-9 9:00
截止时间
2025-3-19 23:59
可延期
24 小时