深度优先搜索和广度优先搜索

一.深度优先

深度优先思想简单理解就是“一条路走到黑”,直到走到不能走,再后退寻找没有走过的路,直到无路可走。所以深度优先的关键在于“每一步只考虑当前这一步怎么做”。

应用:

1.输出1~n的全排列

把这个问题形象化:有n张牌,n个箱子,每个箱子都要编号1~n,每个箱子只能放一张牌,输出所有的可能。、

先走到第1个箱子前,此时可以有n张牌可以放,放一张后走到第2个箱子前,此时可以有n-1张牌可以,这样直到放完最后一张牌,此时已经有一种结果了。那么收回最后一张牌,发现这张牌放最后一个箱子还是已经出现的结果,那么就往后一步,这时再放入之前最后一张牌,就可以得到不同的结果了。所以我们每次放到最后一张牌,得出一个结果后收回牌,如果当前的牌已经出过了就往后退一步直到出现不同的结果。

代码实现

   private static int num;//用于计数
        public static void Func(int n)//n张牌n个箱子
        {
            num = 0;
            int[] pokes = new int[n+1];
            int[] boxs = new int[n+1];
            for (int i = 1; i <= n; i++) { pokes[i] = i; }
            Dfs(1, pokes, boxs);
        }
        private static void Dfs(int step, int[] pokes, int[] boxs)//每一步的操作
        {
           
            int k=boxs.Length;
            if (step == k )//表示已经走到了第k个箱子之后了,没有箱子了,此时从头打印出之前n个箱子里的牌的数值
            { 
                num++;
                Console.Write("第" + num + "种方案:");
                for(int i=1;i<k;i++)
                {
                    Console.Write(boxs[i]+",");
                }
                Console.Write("\n");
                return;
            }
            for (int i = 1; i < pokes.Length; i++)//依次抽出手中的牌
            {
                if (pokes[i]>0)//
                {
                    boxs[step] = pokes[i];
                    pokes[i] = 0;// 表示该手牌已经没有了
                    Dfs(step + 1, pokes, boxs);
                   // boxs[i] = 0;
                    pokes[i] = i;//表示将刚才尝试的手牌收回。
                }
            }
         
            return;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值