题目描述
给定 n ( n ≤ 9 ), 按字典序输出 1 到 n 的所有全排列。
思路分析
要输出1-n的全排列,可以建立一个n个节点的 **无向完全图**
然后对每个点作为起点,分别做一次深度优先搜索,当所有点都已经标记时,输出当前的搜索路径。
因为是按字典序,所以每次从小到大开始遍历
如果当前节点没访问过,就添加其到访问序列arr,同时计数已标记的节点数目depth++
当**所有节点都已访问**时,输出此时的访问序列。
访问结束后,**删除**此节点的**访问标记**。
实现代码
#include<stdio.h>
#include<string.h>
int anssize=0; //已经计数的元素指针
int arr[100]; //记录输出序列
int visit[100]; //访问数组
int num=0; //方案数
void dfs_add(int v){ //添加访问标记
visit[v] = 1;
arr[anssize++] = v;
}
void dfs_dec(int v){ //去掉访问标记
visit[v] = 0;
arr[--anssize]=0;// anssize--即可
}
void dfs_print(){
for(int i=0;i<anssize;i++)
printf("%d ",arr[i]);
putchar('\n');
num++; //共多少种输出序列
}
void dfs(int maxn,int depth){
if(depth == maxn){
dfs_print();
return ;
}
for(int i=1;i<=maxn;i++)
{
if(!visit[i]){
dfs_add(i);
dfs(maxn,depth+1); // depth:已访问的节点个数 到n就输出
dfs_dec(i);
}
}
}
int main(){
int n;
scanf("%d",&n); //从1-n的全排列
dfs(n,0);
printf("共%d种方案",num);
return 0;
}