解题思路:

            对于全排列问题,我们选择深度优先搜索算法(即DFS)实际上是一个递归的思想

下面来讲讲DFS的算法:


                    一、首先对于全排列问题,我们要一个一个节点的找,确保每一个点都没有被漏掉。(DFS没有返回值)

                

                     

20210723213807.png

      由图,可以知道,当我在第三层的时候就已经选完了,所以判断截止条件就是x=3+1(即x=n+1             


    由图,我们也不难看出,当选了第一层之后,第二层的数字不会选第一层重复的,第三层也是一样,那么我就要对使用过的数字做标记,没使用过的也要做标记。(这里我们可以用vis[]数组来做标记,如果该数字没有被选过(即if(!vis[]))那么我将会选它就标记为1,防止下一次循环中我会选到它)

        如果所有数字都选完了之后(1->2->3),需要回溯回溯后数字要记为没有选过,将vis[]标记为0


       类型题DFS学习连接:https://www.bilibili.com/video/BV14E411q73d?from=search&seid=12160764684049469910

参考代码:

#include int n;//输入的值 
int vis[10];//
int a[10];
void dfs(int x)
{
int i;
if(x==n+1)//判断截止条件,选完了、满足条件了我就可以输出了 
{
for(i=1;i<=n;i++)
printf("%d ",a[i]);//打印遍历结果 
printf("\n"); 
}
for(i=1;i<=n;i++)
{
if(!vis[i])//如果这个数没有被选 
{
vis[i]=1;//那么我就选上它,并标记它,表示我已经选过了 
a[x]=i;//把值存进数组a 
dfs(x+1);//递归,要进入下一层 
vis[i]=0;//走投无路了,要返回,记为0,表示我没选过 
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);//x从第一层开始
return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

呆子 3年前 回复TA
大佬厉害了,缺少点东西