dfs解决全排列问题

dfs解决全排列问题 题目链接.

问题描述

给定一个n(0<n≤10),打印n的全排列,要求按字典序输出。

解题思路

该问题相当于找出从某点到目的点的所有路径问题,于是想到用dfs深度优先算法,找到一条路径即可直接输出,直到找到所有的路径。思路大致是,先放置一个数,然后在没有放置过的数字当中选择一个放在下一个位置,依次进行,那我们发现,其实在选择放置下一个数字时,和解决之前的问题是一样的 还是要在没有放置过的数字当中选一个放置,这样就是把问题分解成为了规模更小的相同的问题,那么我们就想到递归。

递归 首先要有一个终止条件,那么这个问题的终止条件就是你已经放置了n个数字。那么在放置过程中,我们需要记录你此时在放置第几个数字。而且需要标记每一个数字是否已经放置过了。

具体代码如下

#include<bits/stdc++.h>
using namespace std;

int n;
int a[12];
bool vis[12];
void dfs(int x){
	if(x == n+1){ //此处为n+1 而不是n,因为如果在第n次时就输出,那么第n个数是没有存进去的 
		for(int i = 1; i<= n-1; i++) {
			printf("%d ",a[i]);
		}
		printf("%d\n",a[n]);
		return;
	}
	for(int i = 1; i<=n; i++){ //遍历n个数字中哪一个没有放置过
		if(vis[i] == false) {
			a[x] = i;
			vis[i] = true;
			dfs(x+1);
			vis[i] = false;
		}
	}
	return;
}
int main(){
	scanf("%d",&n);
	memset(vis,false,sizeof(vis));
	dfs(1); //此时放置第1个数字
} 

猜你喜欢

转载自blog.csdn.net/weixin_43966538/article/details/106229900