A*搜索。

A*搜索的基础百度百科(实在偷懒没看论文之类的),在这里不说了。

A*搜索很关键的是h(n)估价函数的选取(表示现在到结束节点需要的距离)

设d(n)为实际到结束节点的距离。h(n)<=d(n)就又不会丢掉最优解,又可以中途就排除很多不行的答案。

bfs就是一个h(n)=0的A*搜索。。。。。(所有状态都会被加进去,错的离谱的也要)。。。。。

好感人。。。。

。。。说到哪了。。。。

如果俩个状态有n个不一样的地方,至少要走n-1步,这个估价函数相当好。

在这个程序具体实现中dep=d时,其实已经走了(d+1)步。。所以估价函数不用-1.

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std; const int dx[]={2,1,-1,-2,-2,-1,1,2},dy[]={1,2,2,1,-1,-2,-2,-1}; char EndStatus[5][10] = {
"11111",
"01111",
"00*11",
"00001",
"00000", }; struct Status {
char a[5][6];
int x,y; bool operator ==(Status b) {
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(a[i][j] != b.a[i][j]) return false;
return true;
} int differ(Status b) {
int res=0;
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
if(a[i][j] != b.a[i][j]) res++;
return res;
} Status step(int d) {
Status res=*this;
res.x=x+dx[d],res.y=y+dy[d];
if(res.x<0 || res.x>4 || res.y<0 || res.y>4) return *this;
swap(res.a[x][y],res.a[res.x][res.y]);
return res;
} void get() {
for(int i=0;i<5;i++) {
scanf("%s",a[i]);
for(int j=0;j<5;j++) if(a[i][j]=='*') {
x=i; y=j;
}
}
} void get(char b[5][10]) {
for(int i=0;i<5;i++)
for(int j=0;j<5;j++) {
a[i][j]=b[i][j];
if(a[i][j]=='*') {x=i; y=j;}
}
}
}Start,End,t;
int lim,T; bool dfs(int dep,Status s) {
if(dep==lim) return s==End;
for(int d=0;d<8;d++) {
t=s.step(d);
if(!(t==s) && dep+t.differ(End)<=lim) if(dfs(dep+1,t)) return true;
}
return false;
} int main() {
End.get(EndStatus);
scanf("%d",&T);
while(T--) {
Start.get();
for(lim=0;lim<=15;lim++) if(dfs(0,Start)) break;
printf("%d\n",lim>15 ? -1 : lim); }
return 0;
}

1085: [SCOI2005]骑士精神的更多相关文章

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

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

  2. BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2838  Solved: 1663 [Submit][St ...

  3. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

  4. BZOJ(7) 1085: [SCOI2005]骑士精神

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3233  Solved: 1911[Submit][Stat ...

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

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

  6. bzoj 1085: [SCOI2005]骑士精神

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

  7. 1085. [SCOI2005]骑士精神【IDA※】

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

  8. [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]

    题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...

  9. [BZOJ 1085][SCOI2005]骑士精神(IDA*)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1085 分析: 首先第一感觉是宽搜,但是空间需要8^15*5*5,明显不够,又鉴于最大深 ...

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

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1085 $${if (cs+val-1>ans) return ;}$$ #inclu ...

随机推荐

  1. iOS-音频格式转换-b

    iOS处理音频过程中有时候需要不同格式的音频进行转换,最近需要将m4a格式的音频转换成wav,在网上搜索之后代码整理如下: - (void)convetM4aToWav:(NSURL *)origin ...

  2. Careercup - Facebook面试题 - 5412018236424192

    2014-05-01 01:32 题目链接 原题: Given a linked list where apart from the next pointer, every node also has ...

  3. windows批处理(cmd/bat)编程详解

    reference: http://blog.csdn.net/bingjie1217/article/details/12947327 http://www.cnblogs.com/doit8791 ...

  4. BestCoder Round #3

    Task schedule http://acm.hdu.edu.cn/showproblem.php?pid=4907 #include<cstdio> #include<cstr ...

  5. PE文件结构详解(二)可执行文件头

    在PE文件结构详解(一)基本概念里,解释了一些PE文件的一些基本概念,从这篇开始,将详细讲解PE文件中的重要结构. 了解一个文件的格式,最应该首先了解的就是这个文件的文件头的含义,因为几乎所有的文件格 ...

  6. sigleSchool 存储过程例1

    CREATE OR REPLACE PROCEDURE SINGLSCHOOL( PICIID IN VARCHAR2, SCHOOLID IN NUMBER, SCHETYPE IN number, ...

  7. oracle 字符集

    ---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻 ...

  8. Ubuntu 12.04下虚拟磁带库mhvtl的安装和使用

      项目需要连接一下昆腾虚拟磁带库DXI 6701 ,这玩意太贵,不好得到,先弄个虚拟软件测试了, 网上了一下,有这个软件: mhvtl   主页: https://sites.google.com/ ...

  9. zju 1037 Gridland(找规律,水题)

    题目链接 多写几个案例,根据数据的奇偶性,就能找到规律了 #include<stdio.h> int main() { int t,n,m; double ans; scanf(" ...

  10. [Unity菜鸟] 产生各不相同的随机数

    1. 网上很多方法都说用时间种子来解决,但是在极短的时间内,这种方法没效 Random r = new Random(DateTime.Now.Millisecond); Random Counter ...