bzoj1085 骑士精神
Description
在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。
Input
第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。
Output
对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。
启发式搜索
当前状态与目标状态相差n格则说明n-2步内不可能到达目标状态,
限制深度dfs,若经判断在限制步数内不能达到目标状态则剪枝,
逐步提高深度限制直至找到答案或深度到达15仍无解
#include<cstdio>
int n;
int ans[][]={
{,,,,},
{,,,,},
{,,,,},
{,,,,},
{,,,,}
};
int d,maxdep;
bool fo;
int now[][];
int x0,y0;
int xs[]={,,-,-,,,-,-};
int ys[]={,-,,-,,-,,-};
char c;
inline bool eq(){
for(int i=;i<;i++)
for(int j=;j<;j++)if(ans[i][j]!=now[i][j])return ;
return ;
}
inline void swap(int*a,int*b){
int t=*a;
*a=*b;
*b=t;
}
inline int minsteps(){
int a=-;
for(int i=;i<;i++)
for(int j=;j<;j++)if(ans[i][j]!=now[i][j])a++;
return a;
}
void dfs(int dep){
if(fo)return;
if(eq()){
fo=;
d=dep;
return;
}
for(int i=;i<;i++){
int x1=x0+xs[i],y1=y0+ys[i],x2=x0,y2=y0;
if(x1<||y1<||x1>||y1>)continue;
swap(now[x0]+y0,now[x1]+y1);
if(dep+minsteps()<maxdep){
x0=x1;y0=y1;
dfs(dep+);
x0=x2;y0=y2;
}
swap(now[x0]+y0,now[x1]+y1);
}
}
void readc(char&c){
while(c=getchar()){
if(c==''||c==''||c=='*')return;
}
}
int main(){
scanf("%d",&n);
while(n--){
for(int i=;i<;i++){
for(int j=;j<;j++){
readc(c);
now[i][j]=c==''?:c==''?:;
if(c=='*')x0=i,y0=j;
}
}
d=-;
fo=;
for(maxdep=;maxdep<=&&!fo;maxdep++)dfs();
printf("%d\n",d);
}
return ;
}
bzoj1085 骑士精神的更多相关文章
- bzoj1085骑士精神(搜索)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1893 Solved: 1051 Description ...
- BZOJ-1085 骑士精神
估价函数其实就是与目标状态有几个不同... 迭代启发搜索. #include <cstdlib> #include <cstdio> #include <cstring& ...
- BZOJ-1085:骑士精神 (迭代加深 + A*搜索)
题意:给定一个5*5的棋盘,上面有白马给妈给12匹,以及一个空格.问是否能在15步内有给定棋盘转移到目标棋盘. 如果可以,输出最小步数. 否则输出-1: 思路:由于步数比较小,我们就直接不记录状态vi ...
- BZOJ1085 SCOI2005 骑士精神【IDA* 启发式迭代加深】
BZOJ1085 SCOI2005 骑士精神 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐 ...
- 【BZOJ1085】[SCOI2005]骑士精神 双向BFS
[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]骑士精神
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1757 Solved: 961[Submit][Statu ...
- [BZOJ1085] [SCOI2005] 骑士精神 (A*)
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...
- BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解
http://www.lydsy.com/JudgeOnline/problem.php?id=1085 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空 ...
随机推荐
- java之args[0]
java程序有一个主方法main方法,是这样的public static void main(String [] args)args[0]就是用命令行javac编译后java运行java程序时,传入的 ...
- python Django 之 Model ORM inspectdb(数据库表反向生成)
在前一篇我们说了,mybatis-generator反向生成代码. 这里我们开始说如何在django中反向生成mysql model代码. 我们在展示django ORM反向生成之前,我们先说一下怎么 ...
- DevExpress WPF入门指南:如何自动或手动添加DXSplashScreen控件
<DevExpress v17.2 版本更新公开课>点击报名 DevExpress WPF 的 DXSplashScreen 控件在应用加载的时候显示一个启动界面.添加DXSplashSc ...
- 20165202 Mypwd
实现mypwd(选做,加分) 1 学习pwd命令 2 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 3 实现mypwd 4 测试mypwd 提交过程博客的链接 实现过程 使用m ...
- avalonJS-源码阅读(2)
上一篇文章讲述的avalon刷页面所用到的几个函数. 这篇则是主要讲avalon 对刷DOM刷出来的avalon自定义属性如何处理的. 目录[-] avalon页面处理(2)数据结构解析avalon标 ...
- 解决Ubuntu下添加Log却无法输出(高通平台)
1.首先考虑到的是你所添加Log的位置确实没有被调用或者在调用前发生异常终止掉了. 2.你修改后没有进行编译或者没有push/install 3.如果你当前的系统版本是User版本,你在push的时候 ...
- tensorflow中常用学习率更新策略
神经网络训练过程中,根据每batch训练数据前向传播的结果,计算损失函数,再由损失函数根据梯度下降法更新每一个网络参数,在参数更新过程中使用到一个学习率(learning rate),用来定义每次参数 ...
- UNIMRCP 代码走读
基于UNIMRCP1.5.0的代码走读 与 填坑记录 1. server启动配置加载 入口:unimrcp_server.c static apt_bool_t unimrcp_server_load ...
- codeforces1111 简单题【DE】简要题解
D 很显然可以用一个背包算出来凑齐i个位置的方案 然后总的答案就是\(dp_{n / 2}\) 然后需要扣掉不符合条件的就是把选出来的数的贡献剪掉的贡献 然后注意因为是多重集合的排列,所以需要乘上\( ...
- 51Nod:活动安排问题(区间问题)
X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的线段.(注:起点或终点重叠,不算重叠). 例如:[1 5][2 3][3 6],可以选[2 3][3 6],这2条线段互不重 ...