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 题意:给出一个八数码,求出到达指定状态的路径. 思路:路径寻找问题.在这道题里用到的知识点挺多的.第一次用 ...
随机推荐
- 虚拟机linux centoros系统安装
(一) 系统下载地址:https://www.centos.org/download/ (二) 下载安装:vmware.并安装. (三) 虚拟机的安装: 1.创建新的虚拟机 2.选择自定义,下一步 3 ...
- Area---poj1265(皮克定理+多边形求面积)
题目链接:http://poj.org/problem?id=1265 题意是:有一个机器人在矩形网格中行走,起始点是(0,0),每次移动(dx,dy)的偏移量,已知,机器人走的图形是一个多边形,求这 ...
- java内存区域-方法区
方法区(Method Area)与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据.虽然java虚拟机规范把方法区描述为堆的一个 ...
- C++三大特性之多态
原文地址:https://qunxinghu.github.io/2016/09/08/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E5%A ...
- (4.15)存储DAS,NAS,SAN在数据库存储上的应用
关键词:存储,硬盘接口类型,磁盘类型,网络类型,DAS,DNS,SAN 转自:http://blog.51cto.com/qianzhang/1254617 一. 硬盘接口类型 1. 并行接口还是串行 ...
- 005-四种常见的 POST 提交数据方式
1.http请求方法 HTTP Method RFC Request Has Body Response Has Body Safe Idempotent Cacheable GET RFC 7231 ...
- Git:pull --rebase 和 merge --no-ff
首先是吐嘈 如果你正在 code review,看到上图(下文将称之为:提交线图)之后,特别是像我这样有某种洁癖的人,是否感觉特别难受?如果是的话,请看下文吧 :) 为什么 Git 作为分布式版本控制 ...
- [py][mx]django项目-让系统用自定义的users表认证
项目开端 参考的是mxonline项目 先把这两项完成 1.app设计 2.app的models的设计 经过分析系统有四个模块 users - 用户管理 course - 课程管理 oranizati ...
- [lr & ps] 色彩空间管理
色彩空间 • 定义 色彩空间,Color Space,又称作色域.在色彩学中,人们建立了许多色彩模型,以一维.二维.三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间.我们经 ...
- 3:3 OGNL 表达式一
一: 用例 (直接链式访问属性名,其实内部还是的调用set,get方法实现数据的流动); 二: 注意:表达式里面是没有方法的,只能点属性, 访问列表: (访问的时候加上#,表示访问非值栈的内容.) 访 ...