DFS-全排列问题

Posted 桃花涣小鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DFS-全排列问题相关的知识,希望对你有一定的参考价值。

全排列问题

完整代码:

#include<stdio.h>
int n;
int a[100], book[100];
void dfs(int step) {
	if (step == n + 1) {
		for (int i = 1; i <= n; i++)
			printf("%d", a[i]);
		printf("\\n");
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (book[i] == 0) {
			a[step] = i;
			book[i] = 1;
			dfs(step + 1);
			book[i] = 0;
		}
	}
	return;
}
int main(){
	scanf("%d", &n);
	dfs(1);
	return 0;
}

核心代码(DFS部分):

void dfs(int step){
	if(step==n+1){
		for(int i=1;i<=n;i++)
			printf("%d",a[i]);
		printf("\\n");
		return;
	}
	for(int i=1;i<=n;i++){
		if(book[i]==0){
			a[step]=i;
			book[i]=1;
			dfs(step+1);
			book[i]=0;
		}
	}
	return;		
}

让我们来深究DFS内的具体过程

  • 函数层数和每层函数保留的 i 相等
  • 每一层函数往数组中放入的数即为 i
  • i 的大小也决定了是否能够继续for循环继续放数
  • return 的过程中必然将上层函数中放入的数收回

以上是关于DFS-全排列问题的主要内容,如果未能解决你的问题,请参考以下文章

用DFS 解决全排列问题的思想详解

递归实现DFS全排列

CodeVS 1294 全排列(dfs)

解决数字的全排列问题(dfs)

解决数字的全排列问题(dfs)

(DFS全排列)POJ-2718 Smallest Difference