题目链接

  当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. 安卓ListView基础应用

    listview简单描述 主页面: package com.example.listview; import com.lidroid.xutils.ViewUtils; import com.lidr ...

  2. iOS  UDP 广播 AsyncSocket 用法

    因为业务需要,需要用广播发送一个字段,在iOS开发中,用到了AsynSocket. 1.定义一个属性,负责发送和接受数据 #define YX_Local_Host @"255.255.25 ...

  3. POJ 1998 Cube Stacking

    Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes ...

  4. 微信程序开发系列教程(三)使用微信API给微信用户发文本消息

    这个系列的第二篇教程,介绍的实际是被动方式给微信用户发文本消息,即微信用户关注您的公众号时,微信平台将这个关注事件通过一个HTTP post发送到您的微信消息服务器上.您对这个post请求做了应答(格 ...

  5. SAP产品的Field Extensibility

    SAP开发人员的工作职责,除了实现软件的功能性需求外,还会花费相当的精力实现一些非功能性需求,来满足所谓的SAP Product Standard(产品标准).这些产品标准,包含在SAP项目实施中大显 ...

  6. 解决Starting to watch source with Jekyll and Compass. Starting Rack on port 4000

    问题 Starting to watch source with Jekyll and Compass. Starting Rack on port 4000 rake aborted! Errno: ...

  7. 如何诊断 11.2 集群节点驱逐问题 (文档 ID 1674872.1)

    适用于: Oracle Database - Enterprise Edition - 版本 11.2.0.1 到 11.2.0.2 [发行版 11.2]本文档所含信息适用于所有平台 用途 这篇文档提 ...

  8. htmlunit抓取js执行后的网页源码

    上次我不是写了一个自动抓取博客访问量吗 (点击打开链接) 可是昨天晚上我又运行的时候,发现不能用了.. 运行了几次 发现使用URLConnection 得到的网页源码和浏览器直接查看的不同. URLC ...

  9. WPF中实现两个窗口之间传值

    在使用WPF的时候,我们经常会用到窗体之间传值,下面示例主窗口传值到子窗口,子窗口传值到主窗口的方法. 一.主窗口向子窗口传值 主窗口向子窗口传值主要方法就是在子窗口建立一个接收主窗口值的变量,然后实 ...

  10. Spring框架context的注解管理方法之二 使用注解注入基本类型和对象属性 注解annotation和配置文件混合使用(半注解)

    首先还是xml的配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...