【启发式搜索】【A*算法】hdu6171 Admiral

一个舰队的目标状态如上图。红色是旗舰。然后给你初始局面,每一次决策可以把旗舰和其上一层或下一层的两个相邻的进行交换。如果能在20步内出解的话,输出最小步数;否则输出“too difficult”。
把每个方块当成0~5的数,整个状态正好可以压缩成1个21位的6进制数,恰好可以用long long存下,可以用set / 哈希表存储。
定义估价函数f(S)表示局面S的每个格子所在层数与它的目标状态所在层的差的绝对值之和。
这样每一次移动最多使这个值减小2,如果这个值大于(20-已经走的步数)*2,则剪枝。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<set>
using namespace std;
const int dx[]={1,1,-1,-1},dy[]={0,1,0,-1};
typedef long long ll;
typedef pair<int,int> Point;
set<ll>S;
int T;
struct Node{
ll st;
Point pos;
int d;
Node(){}
Node(const ll &st,const Point &pos,const int &d){
this->st=st;
this->pos=pos;
this->d=d;
}
};
int ceng[25];
int Abs(int x){
return x<0 ? (-x) : x;
}
int calc(ll x){
int res=0;
for(int i=0;i<=20;++i){
res+=Abs((int)(x%6ll)-ceng[i]);
x/=6;
}
return res;
}
queue<Node>q;
int wei[8][8];
ll pw[30];
int main(){
int x;
// freopen("1001.in","r",stdin);
// freopen("1001.out","w",stdout);
pw[0]=1;
for(int i=1;i<=20;++i){
pw[i]=pw[i-1]*6ll;
}
scanf("%d",&T);
ceng[0]=ceng[1]=ceng[2]=ceng[3]=ceng[4]=ceng[5]=5;
ceng[6]=ceng[7]=ceng[8]=ceng[9]=ceng[10]=4;
ceng[11]=ceng[12]=ceng[13]=ceng[14]=3;
ceng[15]=ceng[16]=ceng[17]=2;
ceng[18]=ceng[19]=1;
ceng[20]=0;
int pen=20;
for(int i=0;i<6;++i){
for(int j=0;j<=i;++j){
wei[i][j]=pen;
--pen;
}
}
ll goal=0;
for(int i=0;i<6;++i){
for(int j=0;j<=i;++j){
goal=goal*6ll+(ll)i;
}
}
for(;T;--T){
S.clear();
ll st=0;
Point stapos;
for(int i=0;i<6;++i){
for(int j=0;j<=i;++j){
scanf("%d",&x);
if(x==0){
stapos=Point(i,j);
}
st=st*6ll+(ll)x;
}
}
if(st==goal){
puts("0");
continue;
}
S.insert(st);
bool ok=0;
while(!q.empty()){
q.pop();
}
q.push(Node(st,stapos,0));
while(!q.empty()){
Node U=q.front(); q.pop();
// ll now=U.st;
// for(int i=0;i<6;++i){
// for(int j=0;j<=i;++j){
// printf("%I64d ",now/pw[wei[i][j]]%6ll);
// }
// puts("");
// }
// puts("");
if(U.d>=20){
continue;
}
for(int i=0;i<4;++i){
int tx=U.pos.first+dx[i],ty=U.pos.second+dy[i];
if(tx>=0 && tx<=5 && ty>=0 && ty<=tx){
ll nextst=U.st-pw[wei[tx][ty]]*(U.st/pw[wei[tx][ty]]%6ll);
nextst+=pw[wei[U.pos.first][U.pos.second]]*(U.st/pw[wei[tx][ty]]%6ll);
int tmp=calc(nextst);
if(S.find(nextst)==S.end() && tmp<=(20-(U.d+1))*2){
if(nextst==goal){
ok=1;
printf("%d\n",U.d+1);
break;
}
S.insert(nextst);
q.push(Node(nextst,Point(tx,ty),U.d+1));
}
}
}
if(ok){
break;
}
}
if(!ok){
puts("too difficult");
}
}
return 0;
}
【启发式搜索】【A*算法】hdu6171 Admiral的更多相关文章
- 启发式搜索A*算法
A* 寻路算法 (2011-02-15 10:53:11) 转载▼ 标签: 游戏 分类: 算法 概述 虽然掌握了 A* 算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的. 搜索区域(T ...
- 启发式搜索——A*算法
启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...
- 启发式搜索A-Star算法 【寻找 最短路径 算法】【地理几何位置 可利用的情况】
在处理最短路径问题时,有一种启发式算法是我们应该了解的,由于其有着优秀的探索效率在各自现实项目中多有应用,它就是 A-star 算法,或 A* 算法. 个人观点: A* 算法并不保证找到的路径一 ...
- 启发式搜索 A*算法的OC 实现
前两天重新学习了下A*算法,上次学习A*算法已经是5年前了,看到网上铺天盖地的A*算法都是C.C++等等其他语言的,就是没有OC 的,所以抽空写了一份.今天太晚了就不说明A*算法的细节了,大家如果想学 ...
- A*搜寻算法(A星算法)
A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...
- 【算法入门】深度优先搜索(DFS)
深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解 ...
- 深度优先搜索(DFS)
[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 ...
- POJ 2449 Remmarguts' Date --K短路
题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...
- dfs介绍
深度优先搜索(DFS) [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍 ...
随机推荐
- 2017ACM暑期多校联合训练 - Team 1 1001 HDU 6033 Add More Zero (数学)
题目链接 Problem Description There is a youngster known for amateur propositions concerning several math ...
- Kaggle机器学习之模型集成(stacking)
Stacking是用新的模型(次学习器)去学习怎么组合那些基学习器,它的思想源自于Stacked Generalization这篇论文.如果把Bagging看作是多个基分类器的线性组合,那么Stack ...
- static class 和 non static class 的区别
static class non static class 1.用static修饰的是内部类,此时这个 内部类变为静态内部类:对测试有用: 2.内部静态类不需要有指向外部类的引用: 3.静态类只能访问 ...
- 【Matlab】绘制饼状统计图
a=tabulate(b); % b为需要绘制饼图的原始数据列,生成新的一个矩阵a label={'1','2','3'} % 设定饼图每块扇形代表的内容 percent=num2str(a(:,3) ...
- 自动化测试===Macaca环境搭建和说明书
https://www.cnblogs.com/tim2016/p/6400326.html http://www.cnblogs.com/fnng/p/5873878.html https://ww ...
- 2015多校第7场 HDU 5379 Mahjong tree 构造,DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5379 题意:一颗n个节点n-1条边的树,现在要给每个节点标号(1~n),要求:(1)每一层的兄弟节点的 ...
- [bugfix]copy属性参数将NSMutableArray变为NSArray类型
问题:NSMutableArray 声明为 copy 属性参数后即使接受NSMutableArray变量依然为NSArray变量 测试: 属性申明为: 1 @property (nonatomic, ...
- 在ubuntu上配置LAMP架构
1. 安装MySQL /* ubuntu默认进入系统是普通用户 所以在真实工作中,我们会得到root的授权. 所以我们需要用sudo做一切只有root才能完成的操作. */ [root@LAMP ~] ...
- MySQL取得某一范围随机数(MySQL随机数)
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)). 例如, 若要在7 到 12 的范围(包括7和12)内得到一个随 ...
- 883H - Palindromic Cut(思维+STL)
题目链接:http://codeforces.com/problemset/problem/883/H 题目大意:给一段长度为n的字符串s,想让你把s切成几段长度相同的回文串,可以改变s中字符的排列, ...