[搜索]一些搜索的干货

今天老师讲了一些搜索,特此简要记录:

搜索能干什么?

主要有三种:

1. 最优解

2. 解数量

3. 解方案

值得注意的是,除了代价为1且为最优解问题才能用BFS,其余全部用DFS。

一般来说,求最优解的问题最为常见。

关于优化

剪枝

主要也有三种:

1. 可行性剪枝

2. 最优性剪枝

3. 对称性剪枝

详细介绍略回来再补上。

改变搜索顺序

sort+最优性剪枝棒棒哒!

卡时

这是一个很神奇的东西,可以将代码的得分率大大提升。

众所周知,程序时间长了就会TLE,而TLE是一分不得的。于是我们有了一个神奇的玄学思想:

只要在程序大约运行900ms的时候停止搜索输出当前答案,就能有概率得到分!

奇怪的骗分技巧增加了!

那怎么实现呢?

首先,我们引入头文件#include<ctime>,然后就可以进行一波神奇的操作:

if (clock() * 1000 >= 900 * CLOCKS_PER_SEC) //时间快要到了,要准备收拾后事了
{
    输出当前答案; //临死前的回光返照
    exit(0); //直接退出程序,突然猝死
}

这个办法在之前的NOIP有过实战,当时直接把35分->90分。TQL!

值得注意的是,要留出给程序退出的时间,一般卡时可以设到900ms~950ms

有了这些技巧,就可以愉快的去做搜索题了~这里放几道传送门:

k皇后
八数码难题
九数码问题(其实跟八数码几乎一模一样)
一个可以用各种玄学搜索的题
CSP能出现的最难搜索题

遗憾的是,这些题笔者都没有A掉

原文地址:https://www.cnblogs.com/w-rb/p/13759406.html