题目链接

  当guess>limit-deep的时候return就好了。

  guess是估价函数,值为不在自己地盘上的骑士个数。limit是本次迭代阈值。deep是已经走了多少步。

  这个优化是显然的。因为一次跳跃最多可以复原一个骑士。假设最好的情况,所有的骑士都能一步跳回去,如果这样还不能在阈值步数内复原,那不论如何都没法复原了——也就没有继续搜下去的必要了。

  放上代码

  

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<map>
using namespace std;
map<long long,bool>vis;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} long long goal; int u[]={,-,-,,,,,-,-};
int w[]={,-,-,-,-,,,,}; int s[][]={ {, , , , , },
{, , , , , },
{,-, , , , },
{,-,-, , , },
{,-,-,-,-, },
{,-,-,-,-,-} }; int q[][];
char c[];
int ans; void dfs(int deep,int limit,int guess,int x,int y){
if(guess>limit-deep) return;
if(guess==){
ans=ans>deep?deep:ans;
return;
}
for(register int e=;e<=;++e){
int a=x+u[e],b=y+w[e];
if(a>&&b>&&a<&&b<){
int New=guess;
/*if(q[x][y]==s[x][y]&&q[x][y]!=s[a][b]) --New;
if(q[x][y]!=s[x][y]&&q[x][y]==s[a][b]) ++New;*/
if(q[a][b]==s[a][b]&&q[a][b]!=s[x][y]) ++New;
if(q[a][b]!=s[a][b]&&q[a][b]==s[x][y]) --New;
q[x][y]=q[a][b]; q[a][b]=;
if(New<=limit-deep-) dfs(deep+,limit,New,a,b);
q[a][b]=q[x][y]; q[x][y]=;
}
}
} int main(){
int T=read();
while(T--){
ans=0x7fffffff;
//vis.clear();
int x,y,start=;
long long val;
for(int i=;i<=;++i){
scanf("%s",c+);
for(int j=;j<=;++j){
if(c[j]=='*'){
x=i;y=j;
q[i][j]=;
}
else q[i][j]=(c[j]-''==?:-);
if(q[i][j]!=&&q[i][j]!=s[i][j]) start++;
}
}
/*for(int i=1;i<=5;++i,printf("\n"))
for(int j=1;j<=5;++j) printf("%d ",q[i][j]);*/
if(start==){
printf("0\n");
continue;
}
for(int i=;i<=;++i){
//vis.clear();
dfs(,i,start,x,y);
if(ans!=0x7fffffff){
printf("%d\n",ans);
break;
}
}
if(ans!=0x7fffffff) continue;
printf("-1\n");
}
}

【Luogu】P2324骑士精神(IDA*)的更多相关文章

  1. 『骑士精神 IDA*』

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

  2. 埃及分数&&The Rotation Game&&骑士精神——IDA*

    IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...

  3. 【洛谷2324】[SCOI2005]骑士精神 IDA*

    [SCOI2005]骑士精神 描述 在一个\(5×5\)的棋盘上有\(12\)个白色的骑士和\(12\)个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为 ...

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

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

  5. bzoj 1085: [SCOI2005]骑士精神 IDA*

    题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...

  6. 洛谷 - P2324 - 骑士精神 - A*搜索

    为什么估价是16,因为最后一步复原空格可以恢复两个位置,当然设成17.18都可以. #include<bits/stdc++.h> using namespace std; typedef ...

  7. bzoj1085 [SCOI2005]骑士精神——IDA*

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...

  8. bzoj 1085 [SCOI2005]骑士精神——IDA*

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...

  9. [luogu P2324] [SCOI2005]骑士精神

    [luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...

随机推荐

  1. 总结SQL Server窗口函数的简单使用

    总结SQL Server窗口函数的简单使用 前言:我一直十分喜欢使用SQL Server2005/2008的窗口函数,排名函数ROW_NUMBER()尤甚.今天晚上我在查看SQL Server开发的相 ...

  2. eclipse报错MA

    今天有个总监晒了张tomcat7.0崩溃忘记怎么搞了,大家都在吐槽"一个[总监](经常水群)竟然不会这个".敲上来. Problem Occurred系列: 'Starting T ...

  3. fluent_python2

    字典和集合 泛映射类型, 继承自collections.abc, Mapping和MutableMapping 标准库里的所有映射类型都是利用 dict 来实现的,因此它们有个共同的限制,即只有可散列 ...

  4. Maven添加本地依赖

    在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围)       compile 是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的c ...

  5. 几个不错的APP网站。

    http://www.yunshipei.com/yunshipei.html http://www.appcan.cn/

  6. android-menudrawer-master 使用

    1. 参照例子写, 运行总崩溃, 多半是导库问题... 2. 既然这样不行, 只好将源码全部拷贝到工程中了. 然后修错误, (将需要的res 文件复制过来.主要是value中的几个文件) 3. 在Ma ...

  7. 企业自颁布服务器证书的有效性验证(C#为例)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/notjusttech/article/details/72779904 目前根据项目的需要,整理了一 ...

  8. Java中的线程--线程中的工具

    这主要想写一下Java中的jdk提供的一些线程中的工具, 一.semaphore信号灯 Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的 ...

  9. shell脚本,awk实现文件a的每行数据与文件b的相对应的行的值相减,得到其绝对值。

    解题思路 文件 shu 是下面这样的.220 34 50 70553 556 32 211 1 14 98 33 文件 jian是下面这样的.1082 想要得到结果是下面这样的.210 24 40 6 ...

  10. UIViewAnimationOptions

    常规动画属性设置(可以同时选择多个进行设置) UIViewAnimationOptionLayoutSubviews:执行UIView动画时,自动更新Subview的Layout约束.. UIView ...