为什么估价是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. 【网络与系统安全】20179209 利用metasploit对windows系统的渗透

    这次实验的主角是素有"内网杀手"之称的metasploit.还是少说一些夸赞它的话(因为即使功能再强大,不明白它的原理,不会灵活使用它集成的功能,一样没有用),我们直入主题.简单说 ...

  2. SVM怎样解决多分类问题

    从 SVM的那几张图能够看出来,SVM是一种典型的两类分类器.即它仅仅回答属于正类还是负类的问题.而现实中要解决的问题,往往是多类的问题(少部分例外,比如垃圾邮件过滤,就仅仅须要确定"是&q ...

  3. python数据分析之Pandas:汇总和计算描述统计

    pandas对象拥有一组常用的数学和统计方法,大部分都属于约简和汇总统计,用于从Series中提取单个的值,或者从DataFrame中的行或列中提取一个Series.相比Numpy而言,Numpy都是 ...

  4. 【zabbix】自动注册,实现自动发现agent并添加监控(agent不需要任何配置)

    更新: 后来在实际使用中发现,与其使用zabbix自动注册,不如直接调用zabbix的api主动发起添加服务器的请求,这样就不需要在zabbixserver上配置host信息了.实现全自动.具体调用方 ...

  5. Java for LeetCode 104 Maximum Depth of Binary Tree

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  6. python3用pdfminer3k在线读取pdf文件

    import importlib import sys import random from urllib.request import urlopen from urllib.request imp ...

  7. iOS 关于NSNotificationCenter

    通常我们在 iOS 中发生什么事件时该做什么是由 Delegate 实现的,  Apple 还为我们提供了另一种通知响应方式,那就是 NSNotification. NSNotificationCen ...

  8. linux 常用shell脚本语句

    最近老大让写一个shell脚本,每天从一个固定IP中取到相应文件,所以想写一个简单的shell脚本命令,供大家学习交流.先做一个简单的例子,先看效果吧, 代码如下: #!/bin/sh #定义一个变量 ...

  9. 关于SQL语句参数中为多个带‘,’的字符串

    案例分析:画面为多分数选项,根据画面选择的分数组合=@分数,以SELECT * FROM [table_name] WHERE sore IN (@分数) 其实这不算一个复杂的问题,可能由于着急下班, ...

  10. ZOJ - 3430 Detect the Virus —— AC自动机、解码

    题目链接:https://vjudge.net/problem/ZOJ-3430 Detect the Virus Time Limit: 2 Seconds      Memory Limit: 6 ...