zoukankan      html  css  js  c++  java
  • 深度优先搜索DFS;递归

    洛谷P1036 选数

    首先想一下想要实现什么功能,我们想让它一直找数加,如果加够k个了,那么就 return 。所以得有一个数记录加了几个,但是在递归函数里呢,他不知道自己进行到哪一步,所以说就应该形参里放入这个步数 step,执行函数时首先判断是否加够k个了。

    对于递归或者说深度优先搜索来说子函数里都有for循环,这样他们才能一层一层的嵌套。for循环一般分为两种,第一种是。循环的起点与形参有关。另一种这种循环与形参无关。  具体题目要分析该用哪个循环。对于此题,很明显要用第一种。

     回溯是递归中很重要的一个部分。因为递归最根本的本质就是   递---归    ,先往下/里“递”  递到底, 再“归”回来。从开始先一条路走到底,然后慢慢往回退,所以如果对于全局变量的值,我们在走到底回来的过程中,需要将之前算的值进行清空,回到递归之前的值。如  在结束后,说明这条路我们已经走完了,已经回来了, 我们想尝试其他的办法,但这时num肯定发生了变化,我们想尝试其他的情况,必然要对num进行回溯。   回溯有一种替代方式: 将想要回溯的值放入形参中,这样在一个函数里,这个值在  递--归  回来之后,依然不变。也就没必要回溯了。

    递归里找到终止条件是非常重要,这决定了什么时候结束“递”,开始“‘归’”

    同时,对于判断语句,要考虑其出现的位置,自己把过程过一遍就大概知道要放在哪了。

    洛谷P1706 全排列问题

     本题目难度较大。

    这个题与上个题最大的区别是循环用的是从1开始的。并且这道题用到了标记数组。从题目中可开出,数字一够三个就输出,所以肯定要记录步数,步数一到就输出。一开始我没想用输出数组的方法,并且想用这种循环,一个一个数字输出。因为输出是123···所以这样想是很自然地。可是有一个问题,123输出完后,递完了,该归了,要回到2的一层,是不可能输出1的啊,所以必须要用数组存数。并且还要有一个标记数组,标记这个数字被用了没有。核心代码见上图。

    洛谷P1157 组合的输出

     

     这道题和上两道题很像,输出判断同样要用步数,步数放在形参里。  上面中间的图,实现了输出以1开头的。为了继续输出其他开头的,在main函数里用了一个for循环。

    洛谷P1028 数的计算

    这就是最简单的深度优先搜索。到1 为止。6→1 2 3 →1 :1  2:1    3:1   用递归写出来就是上边这个。

  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/lau1997/p/12431311.html
Copyright © 2011-2022 走看看