题目传送门

乍一看好像是搜索题,但搜索明显会超时。

此处采用IDA*的方法求解。

IDA*算法就是基于迭代加深的A*算法。

code:

/**************************************************************
Problem: 1085
User: yekehe
Language: C++
Result: Accepted
Time:656 ms
Memory:1292 kb
****************************************************************/ #include <cstdio>
#include <string>
#include <iostream>
using namespace std; void swap(int &x,int &y){int t=x;x=y;y=t;} const int f[][]={{,,,,},{,,,,},{,,,,},{,,,,},{,,,,}};//目标状态
const int dx[]={,,,,-,-,-,-},dy[]={,-,,-,,-,,-}; int T,a[][],sx,sy,A;
string s;
bool W; int check()
{
for(int i=;i<;i++)
for(int j=;j<;j++)if(a[i][j]!=f[i][j])return ;
return ;
}//判断是否达到目标状态 int AS(int g)
{
int h=;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(a[i][j]!=f[i][j])h++;
return h+g<=A;
}//A*剪枝 void dfs(int x,int y,int tot)
{
if(tot>A)return ;
if(check()){
if(tot==A)W=true;
return ;
}
if(W)return ;
for(int i=;i<;i++){
int fx=x+dx[i],fy=y+dy[i];
if(fx< || fx>= || fy< || fy>=)continue;
swap(a[x][y],a[fx][fy]);
if(AS(tot))dfs(fx,fy,tot+);
swap(a[x][y],a[fx][fy]);
}
return ;
} int main()
{
scanf("%d\n",&T);
while(T--){
W=;
for(int i=;i<;i++){
cin>>s;
for(int j=;j<;j++){
if(s[j]!='*')a[i][j]=s[j]-''+;
else sx=i,sy=j,a[i][j]=;
}
}
for(A=;A<=;A++){dfs(sx,sy,);if(W){printf("%d\n",A);break;}}//迭代
if(!W)puts("-1");
}
return ;
}

BZOJ1085_骑士精神_KEY的更多相关文章

  1. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  2. A*算法详解 BZOJ 1085骑士精神

    转载1:A*算法入门 http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspx 在看下面这篇文章之前,先介绍几个理论知识,有助于理解A*算 ...

  3. 【BZOJ】1085: [SCOI2005]骑士精神(A*启发式搜索)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1085 囧啊囧,看了题解后写了个程序,但是样例总过不了T+T,调试了不下于1个小时,肉眼对拍看了根本看 ...

  4. 【bzoj1085】[SCOI2005]骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1757  Solved: 961[Submit][Statu ...

  5. 【BZOJ 1085】 [SCOI2005]骑士精神

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...

  6. Codevs 2449 骑士精神 2005年省队选拔赛四川

    2449 骑士精神 2005年省队选拔赛四川 时间限制: 1 s 空间限制: 128000 KB 题目等级 : **大师 Master** 题目描述 Description 在一个5×5的棋盘上有12 ...

  7. BZOJ 1085: [SCOI2005]骑士精神( IDDFS + A* )

    一开始写了个 BFS 然后就 T 了... 这道题是迭代加深搜索 + A* -------------------------------------------------------------- ...

  8. [bzoj1805][SCOI2005]骑士精神 [启发式搜索]

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...

  9. 【日常学习】【IDA*】codevs2449 骑士精神题解

    题目描写叙述 Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在不论什么时候一个骑士都能依照骑士的走法(它能够走到和它横坐标相差为1.纵坐标相差为2或 ...

随机推荐

  1. call/apply

    call与apply都可以改变this指向,但是传参列表不同. call 任何一种方法都可以.call,借用别人函数,自己用. call只需把实参按照形参的个数传进去,apply只能传一个argume ...

  2. Vue组件绑定自定义事件

    Vue组件使用v-on绑定自定义事件: 可以分为3步理解: 1.在组件模板中按照正常事件机制绑定事件: template: '<button v-on:click="increment ...

  3. AsyncTask基础知识

    大家都知道,在子线程中是不能更新UI的,必须要采用异步消息处理机制.一般的做法就是在有需要的地方,使用Handler发送消息给主线程,然后在主线程中处理消息更新UI.如果好多子线程都有更新UI的需求, ...

  4. JSFUtils

    import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.MissingRe ...

  5. MySQL常用函数 一

    一.数学函数ABS(x)                    返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x)                返 ...

  6. 浅谈对MJRefresh(上)下拉刷新控件的理解

    MJRefresh GitHub地址:https://github.com/CoderMJLee/MJRefresh 利用业余时间研究了一下iOS的开发,发现OC特定的语法方式吸引了我,而且iOS开发 ...

  7. ECMAScript6 Generator & async

    Generator Generator函数是一个状态机,执行后返回一个遍历器对象.调用遍历器对象的.next()函数获取下一个状态. Generator是一个普通的函数,函数内部使用yield关键字定 ...

  8. Coursera机器学习基石 第2讲:感知器

    第一讲中我们学习了一个机器学习系统的完整框架,包含以下3部分:训练集.假设集.学习算法 一个机器学习系统的工作原理是:学习算法根据训练集,从假设集合H中选择一个最好的假设g,使得g与目标函数f尽可能低 ...

  9. C# 控制台模拟序列化和反序列化

    序列化:将对象转换成二进制串的过程 反序列化:将序列化过程中产生的二进制串转换成对象的过程 作用:传输数据 using System; namespace WriteTextContent { [Se ...

  10. 基于vue脚手架的项目打包上线(发布)方法和误区

    最近要把vue脚手架开发的一个项目上线,只知道vue脚手架是基于node的服务端项目,那么只需要 npm run dev 就可以轻松启动整个项目,当我想当然的给服务器配置合适的node环境(这里也遇到 ...