排列可以分为两类,第一类:是否有序(每一个元素值是否都比前一个元素值大),第二类:数组元素是否可以重复(数组中每个元素是否可以使用多次)。那么这两类结合在一起,就构成了四种情况。
即:
一、有序可重复
二、有序不可重复
三、无序可重复
四、无序不可重复(可使用回溯)
1、有序可重复 代码
#include<cstdio>
using namespace std;
int a[100];
void dfs(int start, int cur) {
if (cur == 3) {
for (int i = 0; i < cur; i++) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
for(int i=start;i<10;i++){
a[cur] = i;
dfs(i,cur+1);
}
}
int main() {
dfs(1,0);
return 0;
}
部分运行结果:
2、有序不可重复 代码
其和 1、 中的有序可重复相似,只是递归函数的第一个参数是i+1,而不是i
#include<cstdio>
using namespace std;
int a[100];
void dfs(int start, int cur) {
if (cur == 3) {
for (int i = 0; i < cur; i++) {
printf("%d ", a[i]);
}
printf("\n");
return;
}
for(int i=start;i<10;i++){
a[cur] = i;
dfs(i+1,cur+1);
}
}
int main() {
dfs(1,0);
return 0;
}
部分运行结果:
3、无序可重复 代码(这时递归函数的参数里,并不需要像前面两种方法一样有start)
#include<cstdio>
using namespace std;
int a[100];
void dfs(int cur){
if(cur==3){
for(int i=0;i<cur;i++) printf("%d ",a[i]);
printf("\n");
return;
}
for(int i=0;i<10;i++){
a[cur] = i;
dfs(cur+1);
}
}
int main(){
dfs(0);
return 0;
}
部分运行结果:(就像是自然数的全体)
4、无序不可重复(在3、的基础上,使用回溯,即vis数组)
#include<cstdio>
using namespace std;
int a[100];
int vis[100];
void dfs(int cur){
if(cur==3){
for(int i=0;i<cur;i++) printf("%d ",a[i]);
printf("\n");
return;
}
for(int i=0;i<10;i++){
if(!vis[i]){
vis[i] = 1;
a[cur] = i;
dfs(cur+1);
vis[i] = 0;
}
}
}
int main(){
dfs(0);
return 0;
}
部分运行结果: