随笔分类 - 搜索 - bfs
摘要:题目大意:给定一个 N 行,M 列的地图,一个直径为 1.6 的圆形机器人需要从起点走到终点,每秒钟可以实现:向左转,向右转,向前 1 3 步。求从起点到终点最少要多长时间。 题解:相比于普通的走迷宫问题,这道题的物体有了体积,最佳的解决方式是选定一个参考点,比如只看这个有体积的机器人的左上角代表整
阅读全文
摘要:题解:普通的 BFS 没什么可说的,字符串处理是这道题的难点,同时需要注意哈希判重。 另外,对于 $string$ 类来说,学到了一个 push_back((char)) 操作。 "c++string类详解" 代码如下 cpp include using namespace std; int n;
阅读全文
摘要:题目大意:给定一个大小为 4 4 的棋盘,分别有 7 个黑子、7 个白子和 2 个空位构成,求出至少需要移动多少步,才能使得四个相同的棋子共线。 题解:显然每一种棋盘的局面都是一个状态,因此需要采用状态压缩的搜索。总共的局面最多有4e7种,并且所给的内存足够开下哈希表。 需要注意的是,数据中有很多不
阅读全文
摘要:对于这道题来说,每个时刻的状态是整个棋盘所有棋子的位置,即:任何一个棋子位置发生了移动,都会使得状态转移。 因此,需要采取将整个状态作为广搜的搜索对象,进行状态压缩。采用哈希得到每个状态的对应的数值,同时维护一个 map 判重即可,顺便记录走到当前状态所需的最短步数。 代码如下
阅读全文
摘要:引理:当一个状态对应的节点第K次从堆中取出时,该状态对应的当前代价是从起点到该点的第K优解。 代码如下
阅读全文
摘要:对于搜索树分支很多且有明确起点和终点的情况时,可以采用双向搜索来减小搜索树的大小。 对于双向BFS来说,与单向最大的不同是双向BFS需要 按层扩展 ,表示可能到达的区域。而单向BFS则是按照单个节点进行扩展,因为只有当前状态。 代码如下: cpp include using namespace st
阅读全文
摘要:普通BFS:每个状态只访问一次,第一次入队时即为该状态对应的最优解。 优先队列BFS:每个状态可能被更新多次,入队多次,但是只会扩展一次,每次出队时即为改状态对应的最优解。 且对于优先队列BFS来说,每次存入队列的不光是像普通BFS的状态,还有当前状态对应的代价,并且是依据最小代价进行扩展。每次状态
阅读全文
摘要:这是一道BFS裸题。不过在处理起始状态时稍有复杂,同时,对于状态转移来说,可以直接采用常量数组进行预处理,避免过多分类讨论。 代码如下: cpp include include include include include using namespace std; const int maxn=5
阅读全文

浙公网安备 33010602011771号