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个数字
}