洛谷 - P2324 - 骑士精神 - A*搜索
为什么估价是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*搜索的更多相关文章
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- 【洛谷P2324】[SCOI2005]骑士精神
骑士精神 题目链接 #include<iostream> #include<cstdio> using namespace std; int t,MAXD,sx,sy; ][] ...
- 【题解】洛谷P1120 小木棍(搜索+剪枝+卡常)
洛谷P1120:https://www.luogu.org/problemnew/show/P1120 思路 明显是搜索题嘛 但是这数据增强不是一星半点呐 我们需要N多的剪枝 PS:需要先删去超出50 ...
- 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]
骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB[Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色的 ...
- bzoj1085骑士精神(搜索)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1893 Solved: 1051 Description ...
- 【题解】洛谷P1731 [NOI1999] 生日蛋糕(搜索+剪枝)
洛谷P1731:https://www.luogu.org/problemnew/show/P1731 思路 三重剪枝 当前表面积+下一层表面积如果超过最优值就退出 当前体积+下一层体积如果超过总体积 ...
- B1085 [SCOI2005]骑士精神 A*搜索
其实就是一个爆搜加剪枝.直接爆搜肯定不行,而A*算法则是想假如剩下都是最优的话,我当前步数还是不足以达到这个状态,那么就直接返回,因为最优状态也无法做到显然不行. 这道题可以用A*最主要就是因为有15 ...
- 和小哥哥一起刷洛谷(5) 图论之深度优先搜索DFS
关于dfs dfs伪代码: void dfs(s){ for(int i=0;i<s的出度;i++){ if(used[i]为真) continue; used[i]=1; dfs(i); } ...
- 和小哥哥一起刷洛谷(4) 图论之广度优先搜索BFS
关于bfs: 你怎么会连这个都不知道!!!自己好好谷歌一下!!!(其实我也刚学) bfs伪代码: while(队列非空){ 取出队首元素u; 弹出队首元素; u染色为黑色; for(int i=0;i ...
随机推荐
- error LNK2022: metadata operation failed (801311D6) : Differing number of methods in duplicated types
本文主要是记录一个C++编译错误的解决方案,具体错误请看本文标题. 这个错误主要是由Managed C++的增量编译导致的,这是VS 2008的一个bug,在VS 2010已经修复,我使用的正式201 ...
- 流畅python学习笔记第十八章:使用asyncio包处理并发(二)
前面介绍了asyncio的用法.下面我们来看下如何用协程的方式来实现之前的旋转指针的方法 @asyncio.coroutine def spin(msg): write,flush=sys.stdou ...
- jstl <c:url>标签
标签作用是将一个URL地址格式化为一个字符串,并且保存在一个变量当中.它具有URL自动重写功能.value指定的URL可以是当前工程的一个URL地址,也可以是其他web工程的URL.但是这时需要con ...
- 使用C语言解析URL
1. [代码]容易写成自己输入URL,这里测试一个例子 #include <stdio.h>#include <stdlib.h>#include <string ...
- CSS3咖啡制作全过程动画
CSS3咖啡制作全过程动画是一款利用纯CSS3实现的咖啡制作全过程动画特效,从把咖啡豆导入杯子,到把咖啡煮好,整个动画还比较流畅. 源码:http://www.huiyi8.com/sc/8788.h ...
- BZOJ 1572 [Usaco2009 Open]工作安排Job:贪心 + 优先队列【先放再更新】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1572 题意: 有n个工作,每个工作有一个截止日期dead[i]和收益pay[i]. 完成一 ...
- CI公用模型
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * SEO管理系统 -- 公用模型 ...
- RAC环境下控制文件损坏重建过程
处理过程参考了: https://blogs.oracle.com/Database4CN/entry/%E5%A6%82%E4%BD%95%E9%87%8D%E5%BB%BArac%E7%9A%84 ...
- listen 60
Barbie Exposure May Limit Girls' Career Imagination The ubiquitous Barbie doll: she's been everythin ...
- oracle Instant Client install
Installation See the Instant Client Home Page for more information. Installation of ZIP files: 1. Do ...