为什么估价是16,因为最后一步复原空格可以恢复两个位置,当然设成17、18都可以。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll; struct State {
char g[5][6]; //矩阵的状态,0是白马,1是黑马,规定空格是*
int hstep; //step+估价函数,至少需要的步数 State() {}
int h(); //估价函数h,为未归位的骑士数
void move_to(int id,int step); //尝试移动状态加入优先队列 bool operator==(const State& s)const {
//无序map
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
if(g[i][j]!=s.g[i][j])
return false;
return true;
} bool operator<(const State& s)const {
//最大堆
return hstep>s.hstep;
} } s_state,t_state; struct State_Hash {
size_t operator()(const State&t)const {
int id=0;
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
id=(id<<1)+(t.g[i][j]-'0');
return id;
}
}; int State::h() {
//估价函数,因为每次移动的是空格
int res=0;
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
if(g[i][j]!=t_state.g[i][j])
res++;
return res;
} //vis从起点开始找到的状态
unordered_map<State,int,State_Hash> vis;
priority_queue<State> pq; int dx[]= {2,1,-1,-2,-2,-1,1,2};
int dy[]= {1,2,2,1,-1,-2,-2,-1}; void State::move_to(int id,int step) {
//空格向id方向移动
int ox=-1;
int oy=-1; for(int i=0; i<5; i++) {
for(int j=0; j<5; j++) {
if(g[i][j]=='*') {
ox=i,oy=j;
break;
}
}
} int nx=ox+dx[id];
int ny=oy+dy[id]; //越界
if(nx<0||ny<0||nx>4||ny>4)
return; State res=*this;
swap(res.g[ox][oy],res.g[nx][ny]); res.hstep=step+1+res.h(); if(hstep>16)
return; if(vis.count(res)) {
return;
} else {
vis[res]=step+1;
pq.push(res);
}
} //单向A*搜索
bool A_star() {
vis.clear();
while(!pq.empty())
pq.pop(); vis[s_state]=0;
pq.push(s_state);
while(!pq.empty()) {
State curstate=pq.top();
pq.pop();
int curstep=vis[curstate];
for(int i=0; i<8; i++)
curstate.move_to(i,curstep);
if(vis.count(t_state))
return true;
}
return false;
} int main() {
#ifdef Yinku
freopen("Yinku.in","r",stdin);
#endif // Yinku
strcpy(t_state.g[0],"11111");
strcpy(t_state.g[1],"01111");
strcpy(t_state.g[2],"00*11");
strcpy(t_state.g[3],"00001");
strcpy(t_state.g[4],"00000");; int T;
scanf("%d",&T);
while(T--) {
for(int i=0; i<5; i++)
scanf("%s",s_state.g[i]); if(A_star()) {
int ans=vis[t_state];
printf("%d\n",ans>15?-1:ans);
} else {
puts("-1");
}
}
return 0;
}

洛谷 - P2324 - 骑士精神 - A*搜索的更多相关文章

  1. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  2. 【洛谷P2324】[SCOI2005]骑士精神

    骑士精神 题目链接 #include<iostream> #include<cstdio> using namespace std; int t,MAXD,sx,sy; ][] ...

  3. 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)

    洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...

  4. 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]

    骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色的 ...

  5. bzoj1085骑士精神(搜索)

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1893  Solved: 1051 Description ...

  6. 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)

    洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...

  7. B1085 [SCOI2005]骑士精神 A*搜索

    其实就是一个爆搜加剪枝.直接爆搜肯定不行,而A*算法则是想假如剩下都是最优的话,我当前步数还是不足以达到这个状态,那么就直接返回,因为最优状态也无法做到显然不行. 这道题可以用A*最主要就是因为有15 ...

  8. 和小哥哥一起刷洛谷(5) 图论之深度优先搜索DFS

    关于dfs dfs伪代码: void dfs(s){ for(int i=0;i<s的出度;i++){ if(used[i]为真) continue; used[i]=1; dfs(i); } ...

  9. 和小哥哥一起刷洛谷(4) 图论之广度优先搜索BFS

    关于bfs: 你怎么会连这个都不知道!!!自己好好谷歌一下!!!(其实我也刚学) bfs伪代码: while(队列非空){ 取出队首元素u; 弹出队首元素; u染色为黑色; for(int i=0;i ...

随机推荐

  1. Discuz!支持发布视频帖子设定 + 修改后台文件

    最近想做一个地方性论坛,果断在阿里巴巴的phpwind论坛程序与腾讯旗下的discuz论坛程序中选择,虽然phpwind大气,后面还是 决定选择了discuz程序用来构建这个平台,经过一番安装后,发现 ...

  2. (转)ARCGIS中坐标转换及地理坐标、投影坐标的定义

    原文地址:http://blog.sina.com.cn/s/blog_663d9a1f01017cyz.html 1.动态投影(ArcMap) 所谓动态投影指,ArcMap中的Data 的空间参考或 ...

  3. Wannafly挑战赛12 B T95要减肥 【贪心】

    链接:https://www.nowcoder.com/acm/contest/79/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  4. codeforces 之 Little Pigs and Wolves

    B-Little Pigs and Wolvestime limit per test2 secondsmemory limit per test256 megabytesinputstandard ...

  5. Hadoop- MapReduce分布式计算框架原理

    分布式计算: 原则:移动计算而尽可能减少移动数据(减少网络开销) 分布式计算其实就是将单台机器上的计算拓展到多台机器上并行计算. MapReduce是一种编程模型.Hadoop MapReduce采用 ...

  6. IE不支持HTML5表单属性placeholder的解决办法

    1. [代码][JavaScript]代码 (function ($) {    $.fn.placeholder = function (options) {        var defaults ...

  7. 分享知识-快乐自己:java 中的访问修饰符

    1):Java中的访问修饰符: Java面向对象的基本思想之一是封装细节并且公开接口.Java语言采用访问控制修饰符来控制类及类的方法和变量的访问权限,从而向使用者暴露接口,但隐藏实现细节. 访问控制 ...

  8. tf.stack和tf.unstack

    import tensorflow as tf a = tf.constant([1,2,3]) b = tf.constant([4,5,6]) c1 = tf.stack([a,b],axis=0 ...

  9. 【Shell】变量的取用、删除、取代与替换

    ——来自<鸟哥的Linux私房菜> ——总结做方便查阅之用 变量的取用: echo echo $variableecho $PATHecho ${PATH} 变量的配置守则1.变量与变量内 ...

  10. Django:locals()小技巧

    locals()返回一个包含当前作用域里面的所有变量和它们的值的字典. 所以可以把views改写为 def current_datetime(request):     current_date = ...