蓝桥杯--搜索技术之暴力与递归全排列(算法笔记5)

        之前参加蓝桥杯的时候一直听网上人说,这是暴力杯,之前以为的暴力杯就是穷举的思想,这下看了暴力求解的解释,发现也基本类似。

        暴力求解法就是:列出所有可能的情况,从中寻找满足题目要求的方案数。暴力就是暴力在这所有可能的情况,这个看似简单其实又难,因为有些问题:迷宫问题。如何判断是否找过了所有的情况,也是一个难点。

再比如,如果是一个全排列问题,那么暴力法的话,就是直接循环到底,列出所有可能,循环循环循环。这对时间要求很高,但是往往题目要求的时间很短,所以暴力求解法时常伴随的弊端就是:时间超限。

        对于大量重复计算导致的时间超限的问题,需要剪枝,这个可以参考斐波那契数列/爬楼梯问题等等。

        关于暴力法更多的介绍,以下粘贴书本内容。

      暴力的通用手段就是搜索,DFS与BFS。

 

递归和排列

搜索问题里面会涉及到一个叫做全排列的问题,全排列的解决方法一个是用STL的next_permutation函数另一个就是dfs。

用STL解决的方式在上一个笔记中已经做出详细解释,此处直接粘贴书上代码。

 

第二个方法就是dfs,dfs其实也是递归的体现。

        在用dfs之前,先考虑暴力的方法来做,由于循环过多,便直接用代码来补充。重要的是明白暴力的思想。

书上的代码的大致思路:从数组的第一个数开始,一次往后填写,后面的每一个数都和前面一个数不一样,那么当第一个数是数组的第一个数即7的时候,后面第二个数可以是7后面的所有数,所以这个循环的终点是num,但是因为是数组的全排列且数组的数据都不一样,所以全排列出来的每一个数都是不一样的。也就有了if(j!=i)这个条件,后面依次写循环。总的来说,这样写很复杂,很麻烦。

递归的方法来做,如何递归,递归的关系式寻找是重点。

看一下书上的推导过程。

这里引用书上的代码进行实现验证。

        关于clock()函数,这个函数得到的时间单位是毫秒,因为我们人常用单位是秒,所以在得出的毫秒级中要除以CLOCKS_PER_SEC,这个就是一秒的时长。得到的最终单位是秒。

        我们发现这个输出数据的秒和第三行执行时间有些许不同,这是因为clock()函数所返回的时间是从,start到end这两句话之间的语句执行的时间,相对于整个代码程序来说,这只是一部分,并不包含上面声明等部分。而这个execution time则是整个代码段执行所需要的时间。

 

写在最后:可恶的TX,今天因为玩了CF,再打开CodeBlocks结果却出现16位不兼容的问题,这个百度上都是说卸载腾讯系列产品,比如CF   [○・`Д´・ ○]。之前用DevC++作为官方指定编译器的时候也是这种情况,卸了重装很多很多次,治标不治本。

今天发现,如果玩了腾讯游戏,想用DevC++或者CodeBlocks那么一定要重启,不然就会出现不兼容的问题。看来还是得先学习再敲代码。

 

 

 

  • 1
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄澈i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值