【双向bfs】2017多校训练十 HDU 6171 Admiral
【题意】
- 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换。
- 我们每一次只能对0点和其他点进行交换。问最少步数,使得最终变成:
0
1 1
2 2 2
3 3 3 3
4 4 4 4 4
5 5 5 5 5 5
【思路】
【AC】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
struct node
{
int val[][];
int tp;
int r;
int c;
int step;
}s,t; ull Hash(node t)
{
ull tmp=;
for(int i=;i<;i++)
{
for(int j=;j<=i;j++)
{
tmp=tmp*+t.val[i][j];
}
}
return tmp;
}
queue<node> Q;
map<ull,int> book[];
int dir[][]={{,},{-,},{,},{-,-}};
int bfs(node s,node t)
{
while(!Q.empty()) Q.pop();
book[].clear();
book[].clear();
s.step=t.step=;
s.tp=;t.tp=;
book[s.tp][Hash(s)]=;
book[t.tp][Hash(t)]=;
Q.push(s);Q.push(t);
while(!Q.empty())
{
node q=Q.front(),e;Q.pop();
ull tmp=Hash(q);
if(book[!q.tp].count(tmp))
{
if(book[!q.tp][tmp]+q.step<=)
return book[!q.tp][tmp]+q.step;
else continue;
}
if(q.step>=) continue;
for(int i=;i<;i++)
{
e=q;
e.r+=dir[i][];
e.c+=dir[i][];
if(e.r<||e.r>=||e.c<||e.c>=||e.c>e.r) continue;
swap(e.val[e.r][e.c],e.val[q.r][q.c]);
ull tmp=Hash(e);
if(book[e.tp].count(tmp)) continue;
book[e.tp][tmp]=++e.step;
Q.push(e);
}
}
return inf;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
for(int i=;i<;i++)
{
for(int j=;j<=i;j++)
{
scanf("%d",&s.val[i][j]);
if(s.val[i][j]==)
{
s.r=i;s.c=j;
}
t.val[i][j]=i;
}
}
t.r=t.c=;
int ans=bfs(s,t);
if(ans==inf) puts("too difficult");
else printf("%d\n",ans);
}
return ;
}
【双向bfs】2017多校训练十 HDU 6171 Admiral的更多相关文章
- 【构造+DFS】2017多校训练三 HDU 6060 RXD and dividing
acm.hdu.edu.cn/showproblem.php?pid=6060 [题意] 给定一棵以1为根的树,把这颗树除1以外的结点划分为k个集合(可以有空集),把1加入划分后的集合 每个集合的结点 ...
- 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge
acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...
- 【(好题)组合数+Lucas定理+公式递推(lowbit+滚动数组)+打表找规律】2017多校训练七 HDU 6129 Just do it
http://acm.hdu.edu.cn/showproblem.php?pid=6129 [题意] 对于一个长度为n的序列a,我们可以计算b[i]=a1^a2^......^ai,这样得到序列b ...
- 【链表】2017多校训练三 HDU 6058 Kanade's sum
acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...
- 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...
- HDU 6171 Admiral(双向BFS+队列)题解
思路: 最大步骤有20,直接BFS会超时. 因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20.这里要保存每个状态搜索到的最小步骤,用Hash储存.当发现现 ...
- 【2017多校训练2+计算几何+板】HDU 6055 Regular polygon
http://acm.hdu.edu.cn/showproblem.php?pid=6055 [题意] 给定n个格点,问有多少个正多边形 [思路] 因为是格点,只可能是正方形 枚举正方形的对角线,因为 ...
- 2017 多校训练 1002 Balala Power!
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 多校训练 1006 Function
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
随机推荐
- xcode或者mac自带颜色器选择rgb格式
解决方法
- poj1595 水题
题意:输入n, 和c 统计1 - n 有多少个素数为cnt 若 2*c > cnt 则将素数全部输出 否则分支判断: 若cnt 为偶数,则从中心开始输出2*c 个 若cnt 为奇数,则从中 ...
- WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)
介绍概念之前,先来分析一段代码: xaml代码如下: <Window x:Class="WpfApp1.MainWindow" xmlns="http://sche ...
- iis隐藏index.php
1.先安装微软的URL Rewrite模块 网址是https://www.iis.net/downloads/microsoft/url-rewrite#additionalDownloads 安装完 ...
- SSI的实例(登录增删改查)
源码下载:http://download.csdn.net/detail/u011518709/8195143 主要jar包: 配置文件:web.xml <?xml version=" ...
- CSS实现跳动的桃心
又来刷题--CSS动画实现跳动的桃心,从哪里跌倒就从哪里爬起来,哈哈哈~ 分析:首先,得画出一个桃心,然后再用动画效果让它跳起来(关于动画,实在是弱项啊~~~,得补补了). 第一步:画桃心,思路是一个 ...
- vue-router介绍及简单使用
一.vue-router介绍 vue-router是vue官方提供的一个路由框架,控制页面路由,使用较为方便. 1.路由模式 hash(浏览器环境默认值),使用 URL hash 值来作路由,支持所有 ...
- 1008: ASCII码
题目描述 相信大家一定都知道大名鼎鼎的ASCII码,这次给你的任务是输入数字(表示ASCII码),输出相对应的字符信息. 输入 第一行为一个整数T(1<=T<=1000).接下来包括T个正 ...
- 使用Spring AOP实现业务依赖解耦
Spring IOC用于解决对象依赖之间的解耦,而Spring AOP则用于解决业务依赖之间的解耦: 统一在一个地方定义[通用功能],通过声明的方式定义这些通用的功能以何种[方式][织入]到某些[特定 ...
- 【计数】51nod1677 treecnt
要将答案看做是小问题的贡献和 Description 给定一棵n个节点的树,从1到n标号.选择k个点,你需要选择一些边使得这k个点通过选择的边联通,目标是使得选择的边数最少. 现需要计算对于所有选择k ...