【Luogu】P2324骑士精神(IDA*)
当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*)的更多相关文章
- 『骑士精神 IDA*』
骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...
- 埃及分数&&The Rotation Game&&骑士精神——IDA*
IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...
- 【洛谷2324】[SCOI2005]骑士精神 IDA*
[SCOI2005]骑士精神 描述 在一个\(5×5\)的棋盘上有\(12\)个白色的骑士和\(12\)个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为 ...
- [BZOJ 1085] [SCOI2005] 骑士精神 [ IDA* 搜索 ]
题目链接 : BZOJ 1085 题目分析 : 本题中可能的状态会有 (2^24) * 25 种状态,需要使用优秀的搜索方式和一些优化技巧. 我使用的是 IDA* 搜索,从小到大枚举步数,每次 DFS ...
- bzoj 1085: [SCOI2005]骑士精神 IDA*
题目链接 给一个图, 目标位置是确定的, 问你能否在15步之内达到目标位置. 因为只有15步, 所以直接ida* #include<bits/stdc++.h> using namespa ...
- 洛谷 - P2324 - 骑士精神 - A*搜索
为什么估价是16,因为最后一步复原空格可以恢复两个位置,当然设成17.18都可以. #include<bits/stdc++.h> using namespace std; typedef ...
- bzoj1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 搜索,IDA*,估价就是最少需要跳的步数: 代码意外地挺好写的,memcmp 用起来好 ...
- bzoj 1085 [SCOI2005]骑士精神——IDA*
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 迭代加深搜索. 估价函数是为了预计步数来剪枝,所以要优于实际步数. 没错,不是为了确定 ...
- [luogu P2324] [SCOI2005]骑士精神
[luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...
随机推荐
- iOS NSDate 常用日期相关函数的封装
Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系. NSDate+Category.h 代码: #import & ...
- Linux if 命令判断条件总结
Linux if 命令判断条件总结Linux if命令 关于文件属性的判断式 -a 如果文件存在 -b 如果文件存在,且该文件是区域设备文件 -c 当file存在并且是字符设备文件时返回真 -d 当p ...
- mysql IF语句使用
类似于三元运算符 1) IF(where,result1,result2) = where?result1:result2 例如 SELECT IF(1=1,1,2) => 1 2) ...
- js对象引用的注意
var p = {}; var arr = []; function a(param) { // var i = param.a; for (var i = 0; i < 3; i++) { p ...
- SQLServer同一实例下事务操作
参考代码: 引用Dapper public bool OrderAdd2(User user, Order order) { string dbString = ConfigurationManage ...
- Robotium实践之路基于APK创建测试项目
1.重新对包进行签名操作 .启动re-sign.jar文件 .找到相应的APK,拖拽置resigner中 2.创建基于APK测试的测试工程 .新建一个安卓测试项目 .选择this project
- common-fileupload上传文件
文件上传在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件上传功 ...
- Flask——基础知识
Flask应用程序 一个简单的Flask应用程序 # 导入flask程序 from flask import Flask # 初始化flask对象 app = Flask(__name__) # 装饰 ...
- Paxos算法与Zookeeper分析,zab (zk)raft协议(etcd) 8. 与Galera及MySQL Group replication的比较
mit 分布式论文集 https://github.com/feixiao/Distributed-Systems wiki上描述的几种都明白了就出师了 raft 和 zab 是类似的,都是1.先选举 ...
- 【DB_MySQL】 limit——取查询结果的子集
语法:select * from student limit beginIndex,length; 这里结果集的下标同数组一样从0开始,beginIndex表示起始位置,length表示从beginI ...