全排列(DFS)

题目:

全排列

题意分析:

给出大小为n的数字,输出1~n的全排列,不允许重复数字
eg: 123 132 213 231 321 312(n=3)

解题思路:

首先讲解DFS,所谓dfs就是深度优先遍历,简单来说"一条路走到黑,不撞南墙不回头",当到达最深处时,然后返回,上一层即里深处最近的一层,从上一层继续深度遍历,以此类推!

回溯标记:在dfs时我们需要标记,已经用过的数字,保证数字不重复!当用过后我们还要取消标记!

我想大部分的人都晕掉了!
我把这道题的状态树画出来!大家就一目了然。

在这里插入图片描述

*黄色的路线是可以得到的!!*依次类推我们还可以画出,以2为根节点,以3为根节点的图,大家不要手懒,一起画一下~~嘻嘻

我们在完成从根节点到其中一条分叉时都要取消标记,不然下一个叉无法使用该数字。

void dfs(int deep)
{
   
    if(deep>n)//深搜到底情况
    {
       //打印1~n全排列
        for(int i=1;i<=n;i++)
        {
   
            printf("%5d",a[i
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值