搜索
Alstein
十年oi一场空,不开longlong见祖宗
展开
-
P2962(折半搜索+状压)
题目挺新奇的一题,用二进制对应位来表示是第几个灯,同时也用二进制来表示对灯的操作,将和这个灯相连的那些灯全部置一,其他置零,那么我们对某个灯进行操作就只需要和这个灯相异或。比如,0号灯和1,3两个灯相连,二进制表示出来就是00…0001011,由于和1相异或状态取反,和0相异或状态不变,我们如果改变了第0个灯的状态,那么1、3也会改变,而把二进制表示的状态和00…0001011相异或就可以得到改变0号灯状态后的状态。此外,这个题直接搜索对所有灯的操作与否复杂度会有2^35,会超时,所以采用折半搜索,先对前原创 2020-07-12 21:07:56 · 249 阅读 · 0 评论 -
八数码问题(A*搜索+剪枝)
题目新技能!康托展开:个人感觉就是全排列中用哈希,把状态压缩了,例如1~9的全排列,如果直接保存,那么最大就是987654321,如果需要标记这个状态的话,数组是不可行的,采用康托展开就可将范围压缩到1 ~ 9!,这样就可以开数组标记;其实也就是离散化,但是离散化的查找是log的,而康托展开可以O(1)地求得;公式:X = A[0] * (n-1)! + A[1] * (n-2)! + … ...原创 2020-02-27 16:50:11 · 465 阅读 · 0 评论 -
poj 3279(状态压缩的搜索)
题目题意:给一个仅由0,1组成nm的矩阵,每次操作可以反转一个单元格(把0变成1,1变成0),同时这个单元格上下左右的所有格子也会反转,求出把整个矩阵都变成0所需的做小操作次数,不可能的话输出-1思路:力扣上有一道很类似的题:转化为全零矩阵的最少反转次数这个唯一的区别就是要记录一下路径;其实我一点没看出来这是个搜索,求抵达某一状态的最小操作数,讲道理广搜是可以做,就是状态的保存不经过处理的...原创 2020-01-24 10:22:22 · 1656 阅读 · 2 评论 -
迭代加深与双向bfs
迭代加深:可以说是有条件的dfs,dfs是循着一条路一直走下去,知道找到答案或者撞墙了才回头,但是这样找到的答案有时候不是最优的或者不是最快的,如果是spj的题有可能裸的dfs会T,而这个的原因就是dfs有点儿傻,它会一直往下走,因此我们可以限制一下dfs的深度,让他到limit_deep就返回,有点像BFS,但主角是dfs,我们只是把该深度限制下所有的dfs结果都找了一遍,如果没有答案就把深度加...原创 2019-10-31 23:44:14 · 264 阅读 · 0 评论