【HDU 6171】Admiral(搜索+剪枝)
题意
目标状态是第i行有i+1个i数字(i=0~5)共6行。给你初始状态,数字0可以交换上一行最近的两个和下一行最近的两个。求20步以内到目标状态的最少步数是多少。
题解
设计一个估价函数来剪枝,每个数最少需要|a[i][j]-i|步回到自己的位置。当所有数回到自己位置,0自然也回到自己位置。所以估价函数不计算0。
然后21个位置,每个位置数字是0~5,用三位2进制表示。总共63位2进制。long long可以记录状态。然后就是搜索了。
代码
#include <cstdio>
#include <map>
#include <cstdlib>
#include <queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,l,r) for (int i=l;i<r;++i)
typedef unsigned long long ull;
int dx[4]={1,1,-1,-1},dy[4]={0,1,0,-1};
map<ull,bool>vis;
struct Sta{
int a[6][6],step,x,y;
Sta(){step=x=y=0;}
};
int gujia(Sta s){
int ans=0;
rep(i,0,6)rep(j,0,i+1)
if(s.a[i][j])ans+=abs(s.a[i][j]-i);
return ans;
}
ull haxi(Sta s){
ull ans=0;
rep(i,0,6)rep(j,0,i+1){
ans<<=3;ans|=s.a[i][j];
}
return ans;
}
int bfs(Sta s){
vis.clear();
queue<Sta>q;q.push(s);
while(!q.empty()){
Sta now=q.front();q.pop();
if(gujia(now)==0)return now.step;
rep(i,0,4){
int x=now.x,y=now.y;
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<6 && ny>=0 && ny<=nx){
swap(now.a[x][y],now.a[nx][ny]);
now.x=nx,now.y=ny,++now.step;
ull hx=haxi(now);
if(!vis[hx]&&gujia(now)+now.step<21){
q.push(now);
vis[hx]=true;
}
swap(now.a[x][y],now.a[nx][ny]);
now.x-=dx[i],now.y-=dy[i],--now.step;
}
}
}
return -1;
}
int main() {
int t;
scanf("%d",&t);
while(t--){
Sta s;
rep(i,0,6)
rep(j,0,i+1){
scanf("%d",&s.a[i][j]);
if(s.a[i][j]==0)s.x=i,s.y=j;
}
int ans=bfs(s);
if(ans==-1)puts("too difficult");else printf("%d\n",ans);
}
return 0;
}
【HDU 6171】Admiral(搜索+剪枝)的更多相关文章
- 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...
- HDU 5305 Friends (搜索+剪枝) 2015多校联合第二场
開始对点搜索,直接写乱了.想了想对边搜索,尽管复杂度高.剪枝一下水过去了. 代码: #include<cstdio> #include<iostream> #include&l ...
- HDU 6171 Admiral(双向BFS+队列)题解
思路: 最大步骤有20,直接BFS会超时. 因为知道开始情况和结果所以可以用双向BFS,每个BFS规定最大步骤为10,这样相加肯定小于20.这里要保存每个状态搜索到的最小步骤,用Hash储存.当发现现 ...
- 【双向bfs】2017多校训练十 HDU 6171 Admiral
[题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...
- hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...
- hdu 5887 搜索+剪枝
Herbs Gathering Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- HDU 2437 Jerboas (剪枝搜索)
题意:给定一幅图,图上有两种点T,P.......一只跳鼠在一个T点作为起始点,它想通过图上的路到达某个P点,P点满足如下要求: (1).到达P点的途中路径权值为k的倍数 (2).尽量让路径权值取最小 ...
- hdu 5113(2014北京—搜索+剪枝)
题意:有N*M的棋盘,用K种颜色去染,要求相邻块不能同色.已知每种颜色要染的块数,问能不能染,如果能,输出任一种染法. 最开始dfs失败了- -,优先搜索一行,搜完后进入下一列,超时.本来以为搜索不行 ...
- hdu 1010 深搜+剪枝
深度搜索 剪枝 还不是很理解 贴上众神代码 //http://blog.csdn.net/vsooda/article/details/7884772#include<iostream> ...
随机推荐
- 2018 Multi-University Training Contest 1
比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...
- Linux下查看文件系统磁盘使用
[root@localhost ~]# df -h 可以查看所有文件系统的磁盘使用情况 du --max-depth=1 -h 可以查看当前目录下各子目录的磁盘使用情况 参考:http://www.2 ...
- python3 selenium webdriver 元素定位xpath定位骚操作
源文http://www.cnblogs.com/qingchunjun/p/4208159.html By.xpath() 这个方法是非常强大的元素查找方式,使用这种方法几乎可以定位到页面上的任意元 ...
- css中如何做到容器按比例缩放
需求: 一般在响应式中,我们会要求视频的宽高比为16:9或4:3,这么一来就比较头大了.当用户改变浏览器宽度的时候(改变高度不考虑),视频的宽度变了,那么高度也得根据我们要求的16:9或4:3改变. ...
- Oracle 强制中止正在执行的SQL语句
-- 1 查询正在执行的sql语句 select b.sid, b.username, b.serial#, a.spid, b.paddr, c.sql_text, b.machine from v ...
- [转帖]linux tree命令--显示目录的树形结构
linux tree命令--显示目录的树形结构 版权声明:iamqilei@qq.com https://blog.csdn.net/u011729865/article/details/533 ...
- PL/SQL如何调试sql语句、存储过程
一直以来,我总是在sql的工具,比如sql server.navicat等中执行sql语句来发现问题自己写的sql中的问题,结果被问起时,让人贻笑大方! 那么如何调试成白行的存储过程?如何调试成百行s ...
- laravel添加model文件夹,需要改动的地方
首先,将app\User(等model文件),移入APP\modellists文件夹中,方便整理 第二,修改模型中命名空间和引用其他model的路径 第三,将文件夹app\admin中的控制器文件,全 ...
- python学习 第二天
一.变量 1.变量名: 数字,字母,下划线 alex1=123 sb=“alex” a_lex=“sb” 不能以数字开头 lalex 变量名不是python内部的关键字 {‘and’,'as','as ...
- memcach 命令行
1. cmd上登录memcache # telnet 127.0.0.1 11211 2. 列出所有items stats items 3. 通过itemid获取key 接下来基于列出的i ...