Admiral(双向BFS + Hash)】的更多相关文章

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以变为初始状态,若需要的步数大于20,直接输出too difficult,初始状态为: 0  1 1  2 2 2  3 3 3 3  4 4 4 4 4  5 5 5 5 5 5 解法:两种方法,一种是双向BFS+Hash,另外是A*估价+Hash. //双BFS #include <bits/st…
Problem Description Suppose that you are an admiral of a famous naval troop. Our naval forces have got 21 battleships. There are 6 types of battleships. First, we have got one flagship in which the admiral must be and it is denoted by number 0. Other…
思路: 最大步骤有20,直接BFS会超时. 因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20.这里要保存每个状态搜索到的最小步骤,用Hash储存.当发现现有状态已经在另一路出现了,那么就输出两者相加的步骤和. 代码: #include<iostream> #include<algorithm> #include<queue> #include<map> #define ll long long using nam…
http://www.lydsy.com/JudgeOnline/problem.php?id=1054 一开始我还以为要双向广搜....但是很水的数据,不需要了. 直接bfs+hash判重即可. #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> using n…
Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered from 1 to 8, from the top to the bottom and from left to right respectively.There are four identical pieces on the board. In one move it is allowed to…
题目链接 https://vjudge.net/problem/HDU-1043 经典的八数码问题,学过算法的老哥都会拿它练搜索 题意: 给出每行一组的数据,每组数据代表3*3的八数码表,要求程序复原为初始状态 思路: 参加网站比赛时拿到此题目,因为之前写过八数码问题,心中暗喜,于是写出一套暴力bfs+hash,结果TLE呵呵 思路一:bfs+hash(TLE) #include <cstdio> #include <cstring> #include <queue>…
题目链接 单向bfs就是水题 #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int INF = 0x3f3f3f3f; + ; struct Node { int x, y; }; int g[Max][Max]; int vis[Max][Max];…
http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. 需要检查两次某个地点是否有ghost,正要到达的时候(t),以及即将启程的时候(t+1). 在编程时需要注意的是: 当两个人汇合时,不需要检查即将启程的那次. M可以走3步,在这3步中间只需要检查是否能到达(t) 出问题在: 1. 检查时间处理的不清晰 2.普通bfs会超时 3.双向bfs需要完全…
题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, 然后求最短路即可. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstr…
转自:http://www.cppblog.com/Yuan/archive/2011/02/23/140553.aspx 如果目标也已知的话,用双向BFS能很大程度上提高速度. 单向时,是 b^len的扩展: 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时. 至于实现上,网上有些做法是用两个队列,交替节点搜索 ×,如下面的伪代码:    while(!empty()){ 扩展正向一个节点 遇到反向已经扩展的return 扩展反向一个节点 遇到正向已经扩展的return }…