HDU 6171 Admiral(双向BFS+队列)题解
思路:
最大步骤有20,直接BFS会超时。
因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20。这里要保存每个状态搜索到的最小步骤,用Hash储存。当发现现有状态已经在另一路出现了,那么就输出两者相加的步骤和。
代码:
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int N = 100+5;
int to[4][2] = {1,0,1,1,-1,0,-1,-1}; //下,右下,上,左上
map<ll,int> s[2];
struct node{
int flag;
int x,y;
int p[6][6];
int len;
};
ll Hash(node a){
ll ans = 0;
for(int i = 0;i < 6;i++){
for(int j = 0;j <= i;j++){
ans = ans*6 + a.p[i][j];
}
}
return ans;
}
void BFS(node a,node b){
s[0].clear();
s[1].clear();
queue<node> q;
while(!q.empty()) q.pop();
s[a.flag][Hash(a)] = 0;
s[b.flag][Hash(b)] = 0;
q.push(a);
q.push(b);
while(!q.empty()){
a = q.front();
q.pop();
if(s[!a.flag].count(Hash(a))){
int ans = s[!a.flag][Hash(a)] + a.len;
printf("%d\n",ans);
return;
}
for(int i = 0;i < 4;i++){
b = a;
b.x += to[i][0];
b.y += to[i][1];
if(b.x < 0 || b.y < 0 || b.y > b.x || b.x > 5) continue;
swap(b.p[b.x][b.y],b.p[a.x][a.y]);
ll num = Hash(b);
if(s[b.flag].count(num)) continue;
b.len += 1;
if(b.len <= 10){
s[b.flag][num] = b.len;
q.push(b);
}
}
}
printf("too difficult\n");
}
int main(){
int T,cnt,tp;
node a,b;
scanf("%d",&T);
while(T--){
for(int i = 0;i <= 5;i++){
for(int j = 0;j <= i;j++){
scanf("%d",&a.p[i][j]);
if(a.p[i][j] == 0) a.x = i,a.y = j;
b.p[i][j] = i; //最后
}
}
a.flag = 0,a.len = 0;
b.x = b.y = b.len = 0,b.flag = 1;
BFS(a,b);
}
return 0;
}
HDU 6171 Admiral(双向BFS+队列)题解的更多相关文章
- 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...
- HDU 3085 Nightmare Ⅱ 双向BFS
题意:很好理解,然后注意几点,男的可以一秒走三步,也就是三步以内的都可以,鬼可以穿墙,但是人不可以,鬼是一次走两步 分析:我刚开始男女,鬼BFS三遍,然后最后处理答案,严重超时,然后上网看题解,发现是 ...
- HDU 3085 Nightmare Ⅱ (双向BFS)
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1242 -Rescue (双向BFS)&&( BFS+优先队列)
题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...
- 【双向bfs】2017多校训练十 HDU 6171 Admiral
[题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...
- Nightmare Ⅱ HDU - 3085 (双向bfs)
Last night, little erriyue had a horrible nightmare. He dreamed that he and his girl friend were tra ...
- 【HDU 6171】Admiral(搜索+剪枝)
多校10 1001 HDU 6171 Admiral 题意 目标状态是第i行有i+1个i数字(i=0-5)共6行.给你初始状态,数字0可以交换上一行最近的两个和下一行最近的两个.求20步以内到目标状态 ...
- ACM-BFS之Open the Lock——hdu1195(双向BFS)
这道题的0基础版本号,暴力BFS及题目详情请戳:http://blog.csdn.net/lttree/article/details/24658031 上回书说道,要用双向BFS来尝试一下. 最终A ...
- HDU 1043 Eight(双向BFS+康托展开)
http://acm.hdu.edu.cn/showproblem.php?pid=1043 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
随机推荐
- 【python-opencv】对象测量
opencv 中轮廓特征包括: 如面积,周长,质心,边界框等 *弧长与面积测量 *多边形拟合 *获取轮廓的多边形拟合结果 python-opencv API提供方法: cv2.moments()用来计 ...
- What is Druid?
Druid is a data store designed for high-performance slice-and-dice analytics ("OLAP"-style ...
- Ubuntu搭建solr搜索服务器
参考:http://blog.csdn.net/makang110/article/details/50971705 一:搭建solr服务器 1:安装jdk1.7,并配置环境变量 2:下载tomcat ...
- (转载)【cocos2dx 3.x Lua] 注册事件函数详解
出处: http://www.2cto.com/kf/201409/338235.html coocs2dx 版本 3.1.1 registerScriptTouchHandler 注册触屏事件 re ...
- Qt计时器
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度. ■.QObject类的定时器QObje ...
- Canvas标签基础
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SV搭建验证环境
1)首先定义纯虚类Sv_object,主要实现下边两个function: 定义local static 变量nextobjectID; 虚方法 virtual function void copy(S ...
- Object-C-Foundation-数组排序
系统类型排序; NSArray *goodsNames =@[@"computer",@"iphone",@"ipad"]; NSArray ...
- webstorm的个性化设置settings
如何更改主题(字体&配色):File -> settings -> Editor -> colors&fonts -> scheme name.主题下载地址 如 ...
- BabelMap 10.0.0.5 汉化版已经发布
新的 BabelMap 调整了用户体验的一些细节.修正了西夏语表意文字序列.修正了一些文字显示不全的问题. 请点击页面左上角连接,进入下载页面下载.