四种类型的排列

排列可以分为两类,第一类:是否有序(每一个元素值是否都比前一个元素值大),第二类:数组元素是否可以重复(数组中每个元素是否可以使用多次)。那么这两类结合在一起,就构成了四种情况。

即:

一、有序可重复

二、有序不可重复

三、无序可重复

四、无序不可重复(可使用回溯)

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;
}

部分运行结果:


猜你喜欢

转载自blog.csdn.net/jiuweideqixu/article/details/88773792