题目连接:P1157 组合的输出 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 30;
int st[N];//用来存这个数用没用过(1~n个数)
int n,r;
//求组合数,u表示当前到了哪个位置,start表示现在用到了1~n哪个数
void dfs(int u,int start)
{
//剪枝优化
if((u-1) + (n-start+1) < r) return;
if(u>r)
{
for(int i=1;i<=r;i++)
{
printf("%3d",st[i]);
}
puts("");//换行,比printf()快
return;
}
//从start开始保证了后一个数一定大于前一个数
for(int i=start;i<=n;i++)
{
st[u] = i;//标记
dfs(u+1,i+1);//向下搜索
st[u] = 0;//恢复现场
}
}
int main()
{
cin >> n >> r;
dfs(1,1);//刚开始从第一个位置和数字1开始
return 0;
}