摘要: 这是一道裸的广搜题吧…… 可能是《算法竞赛进阶指南》最水的一道题了…… 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 queue<i 阅读全文
posted @ 2019-03-23 20:17 AD_shl 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 这是一道广搜题,难点在于对题目的理解和对细节的处理。 对于一个节点,可以向左上、左下、右上、右下四个位置扩展,根据地图的形态确定每一步扩展的代价。 将代价最小的节点放在队头,这样用双端队列来实现。每个节点最多进出队列一次,所以时间复杂度为O(r*c) 1 #include <iostream> 2 阅读全文
posted @ 2019-03-23 15:21 AD_shl 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 搜索绝对是解决数独问题的一大利器。 我们将不完整的数独读入。如果爆搜的话显然凉凉O(2^81)? 想一下人类在玩数独的时候会怎样——找出填数比较多的行与列的交点,因为这样能排除更多的非法选择。 放到搜索上就能减小搜索树的规模,降低时间复杂度。 我们统计每一行、每一列已经填完的数的数量,再统计每一行、 阅读全文
posted @ 2019-03-23 14:35 AD_shl 阅读(304) 评论(0) 推荐(1) 编辑
摘要: 乍一看,我想爆搜,但是时间复杂度O(2^n),凉凉。 所以我们考虑优化,用双向搜索解决。 将读入的数据降序排列,从中间一分两半,对前一半进行一次枚举,枚举可能的情况,用一个数组记录并去重。 再枚举后半段的情况,并对每一种情况在左半部分进行一次二分查找即可。时间复杂度为O(2n/2log22n/2)≈ 阅读全文
posted @ 2019-03-23 14:24 AD_shl 阅读(256) 评论(0) 推荐(0) 编辑
摘要: 确实是一道经典的深搜好题,(不过POJ不都是这样吗……)。 首先这道题爆搜就死定了,所以咱们考虑一些剪枝。 1.对所有的木棍按长度降序排序,先尝试较长的木棍,这样可以减少搜索树的分支。 2.定义一个变量,记录最近一次搜索失败的木棍的长度,若即将搜索的长度与之相等,则直接跳过。 3.如果在原始木棒“加 阅读全文
posted @ 2019-03-23 10:38 AD_shl 阅读(180) 评论(0) 推荐(0) 编辑