```cpp
#include<iostream>
using namespace std;
int A[20],N,R;
bool B[20];
void f(int n){ //n代表存放数字的下标
if(n==R){ //如果全部存放完毕,代表结束返回
for(int i=0;i<R;i++) {//-------------------这里注意开始和结束的下标
printf("%3d",A[i]);
}
cout<<endl;
return;
}
for(int i=1;i<=N;i++){
if(B[i]==true&&(n>=1&&i>A[n-1]||n==0)){//-------------------这里注意:1.运算符的优先级,需加括号 2.要分n是否为0的情况,而不是是否为1的情况
A[n]=i;//----------------------------注意下标
B[i]=false;
f(n+1);
B[i]=true;//回溯
}
}
}
int main(){
cin>>N>>R;
for(int i=1;i<=N;i++) B[i]=true;//--------------注意开始和结束的下标
f(0);
return 0;//--------------------(return 0是个好习惯)
}
```
不知道对不对(<ゝω・)☆
by wanggk @ 2021-04-23 16:10:38
@[wanggk王冠龛](/user/252664)
谢谢大佬,这题困扰我的就是下标,自己没怎么注意,谢谢!
by 衛宮士郎 @ 2021-04-23 19:07:26
@[wanggk王冠龛](/user/252664) 救救孩子=。=、为什么我这个会只会输出1遍!
by Asbintle @ 2021-10-05 13:56:14
@[Aspintle](/user/562178) 看下代码?
by wanggk @ 2021-10-05 20:21:05
@[Aspintle](/user/562178) 输出一遍有可能是dfs调用后没有将vis数组回溯掉(具体代码你发一下吧)
by wanggk @ 2021-10-05 20:22:34
@[wanggk王冠龛](/user/252664)
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,r;
int arr[109];
void dfs(int ceng,int a){
if(ceng>n){
for(int i=1;i<=r;i++){
printf("%3d",arr[i]);
}
cout<<endl;
return;
}
for(int i=a;i<=n;i++){
arr[ceng]=i;
dfs(ceng+1,i+1);
}
}
int main(){
cin>>n>>r;
dfs(1,1);
return 0;
}
```
by Asbintle @ 2021-10-06 09:33:42
@[wanggk王冠龛](/user/252664)
~~习惯一下本蒟蒻的码风~~
by Asbintle @ 2021-10-06 09:37:06
@[Aspintle](/user/562178)
`if(ceng>n)`改为`if(ceng>r)`这样就能过样例了(因为是n个数里选r个)
by wanggk @ 2021-10-06 12:53:00
@[wanggk王冠龛](/user/252664) 已AC,谢谢
by Asbintle @ 2021-10-06 13:52:40