【BZOJ1085】[SCOI2005]骑士精神 双向BFS
【BZOJ1085】[SCOI2005]骑士精神
Description
在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。

Input
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
Output
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
Sample Input
10110
01*11
10111
01001
00000
01011
110*1
01110
01010
00100
Sample Output
-1
题解:由于只需要15步,所以正着搜8步,反着搜7步即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <utility>
#include <map>
#define F first
#define S second
#define mp(A,B) make_pair(A,B)
#define P(A,B) (1<<(A*5+B))
using namespace std;
typedef pair<int,int> pii; const int S=33000480;
map<pii,int> s1,s2;
queue<pii> q;
int dx[]={1,2,2,1,-1,-2,-2,-1},dy[]={2,1,-1,-2,-2,-1,1,2};
char rd()
{
char gc=getchar();
while(gc!='1'&&gc!='0'&&gc!='*') gc=getchar();
return gc;
}
void work1()
{
s1[mp(S,12)]=0;
q.push(mp(S,12));
while(!q.empty())
{
pii u=q.front(),v;
q.pop();
if(s1[u]==8) continue;
int i,x=u.S/5,y=u.S%5,tx,ty,a;
for(i=0;i<8;i++)
{
tx=x+dx[i],ty=y+dy[i];
if(tx>=5||tx<0||ty>=5||ty<0) continue;
v.S=tx*5+ty,a=((u.F>>v.S)&1),v.F=u.F^(a<<v.S),v.F|=(a<<(x*5+y));
if(s1.find(v)==s1.end()) q.push(v),s1[v]=s1[u]+1;
}
}
}
void work2()
{
pii tmp=mp(0,0);
for(int i=24;i>=0;i--)
{
char gc=rd();
if(gc=='1') tmp.F|=(1<<i);
if(gc=='*') tmp.S=i;
}
s2.clear(),s2[tmp]=0;
q.push(tmp);
int ans=20;
while(!q.empty())
{
pii u=q.front(),v;
q.pop();
if(s1.find(u)!=s1.end()) ans=min(ans,s1[u]+s2[u]);
if(s2[u]==7) continue;
int i,x=u.S/5,y=u.S%5,tx,ty,a;
for(i=0;i<8;i++)
{
tx=x+dx[i],ty=y+dy[i];
if(tx>=5||tx<0||ty>=5||ty<0) continue;
v.S=tx*5+ty,a=((u.F>>v.S)&1),v.F=u.F^(a<<v.S),v.F|=(a<<(x*5+y));
if(s2.find(v)==s2.end()) q.push(v),s2[v]=s2[u]+1;
}
}
if(ans==20) printf("-1\n");
else printf("%d\n",ans);
}
int main()
{
work1();
int T;
scanf("%d",&T);
while(T--) work2();
return 0;
}
【BZOJ1085】[SCOI2005]骑士精神 双向BFS的更多相关文章
- BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】
BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1800 Solved: 984[Submit][Statu ...
- [BZOJ1085] [SCOI2005] 骑士精神 (A*)
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...
- [BZOJ1085][SCOI2005]骑士精神 搜索
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085 大的思路是迭代加深搜索,我们加一个明显的剪枝,当棋盘中位置不对的骑士的数目加上已经走 ...
- BZOJ1085: [SCOI2005]骑士精神
传送门 dfs+A*优化. A*是人工智能算法,属于启发式搜索的一部分.第一次知道这个名词是在写虫食算的时候闵神说这个用A*搞跑的比谁都快..但是当时搜了很多资料想搞清楚这个东西,但是当时还是太拿衣服 ...
- BZOJ1085 [SCOI2005]骑士精神(IDA*)
IDA*是IDS的基础上加上满足A*算法的估值函数来剪枝的搜索算法. 这题代码量挺少的,可以看出整个IDA*的框架: #include<cstdio> #include<cstrin ...
- bzoj1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...
- 【bzoj1085】[SCOI2005]骑士精神
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1757 Solved: 961[Submit][Statu ...
- BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )
一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...
随机推荐
- CodeForces 618D Hamiltonian Spanning Tree
题意:要把所有的节点都访问一次,并且不能重复访问,有两种方式访问,一种是根据树上的路径 走和当前节点连接的下一个节点cost x, 或者可以不走树上边,直接跳到不与当前节点连接的节点,cost y 分 ...
- watch watch watch the video! I got almost addicted. Oh what a fuck!!!!
http://v.huya.com/play/574329.html#relate_vid=570467
- Django 博客首页视图
Django 处理 HTTP 请求 Web 应用的交互过程其实就是 HTTP 请求与响应的过程.无论是在 PC 端还是移动端,我们通常使用浏览器来上网,上网流程大致来说是这样的: 我们打开浏览器,在地 ...
- jiffies溢出与时间先后比较-time_after,time_before
参考地址: http://blog.csdn.net/jk110333/article/details/8177285 http://blog.chinaunix.net/uid-23629988-i ...
- [List] C#数组学习
数组概述 C# 数组从零开始建立索引,即数组索引从零开始.C# 中数组的工作方式与在大多数其他流行语言中的工作方式类似.但还有一些差异应引起注意.声明数组时,方括号 ([]) 必须跟在类型后面,而不是 ...
- Web前端入门知识
第一阶段:理论知识 第一章:协议理解 第二阶段:了解知识 第二章:前端简介 第三阶段:入门知识 第三章:标签结构 第四章:常用标签 第四阶段:样式搭配 第五章:样式初见 第六章:属性选择 第七章:属性 ...
- bzero和memset
一. bzero和memset函数 1. bzero已不建议使用 原型:extern void bzero(void *s, int n); 2.memset void *memset(void *s ...
- bzoj 4921: [Lydsy六月月赛]互质序列
4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 188 Solved: 110[Submit][Status ...
- SSM整合案例
使用IDEA整合SSM spring核心配置文件:beans_core.xml/applicationContext.xml <?xml version="1.0" enco ...
- linux mysql添加用户名并实现远程访问
第一步:登陆linux,在终端登陆mysql #mysql -u root -p 第二步:查询系统用户列表并进行添加用户 mysql>select host,user,password from ...