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   用递归写出来就是上边这个。

  • 相关阅读:
    poj1877
    poj2163
    API hook 单步调试
    用VC++编写勾子程序(转)
    不使用DLL创建全局系统钩子
    接触DLL编写并实现线程注入和全局钩子
    根据RGB计算亮度
    !!!光线对视频识别技术的影响
    消息钩子函数入门篇
    “蓝脑”计划:人造大脑的可能性 文化·探索 CCTV_com
  • 原文地址:https://www.cnblogs.com/lau1997/p/12431311.html
Copyright © 2011-2022 走看看