P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

传送门

文章目录

  • 解析

请添加图片描述

解析

很显然,让马走的话状态记录和转移都会比较复杂
所以转化成让空位跳会更好做一点
但这不是重点
初看本题,其实第一感觉是bfs
但是状态数理论上最差可以达到815,(当然基本不可能跑满),是无法接受的
注意到,本题中出现了只需求15步以内的答案的要求,我们就想到使用迭代加深搜索,逐步扩大搜索树的深度,这样就能利用dfs的同时,保证最先出现的答案就是最优解。
但是,对于无解或答案接近15的情况来说,这个在时间复杂度上其实并没有起到太多优化的作用
因此我们需要更好的剪枝策略
可以引入一个估价函数,记为h
其意义是最好情况下,当前状况完成任务所需要的步数
再设当前步数为step,迭代的深度上限是maxstep,那么当——
step+h>maxstepstep+h>maxstepstep+h>maxstep
时,可以直接return
对于本题,估价函数可以是当前状态与目标状态(这里可以打个表)逐位比较,有不同则加一
(注意,因为当最后一步时,空位和马会同时归位,估计函数会减2,所以上面的式子应该对于本题有一个特殊的修改:
step+h>maxstep+1step+h>maxstep+1step+h>maxstep+1

通过这样剪枝,就大大减少了不必要的搜索
使本题得以解决
(本题还有一个作用颇大的剪枝策略:就是记录一下上一步跳的方向,防止搜索过程中出现来回横跳的无意义搜索)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+100;
const int mod=20040313;
int read(){int res=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-'){f=-1;}c=getchar();}while(c>='0'&&c<='9'){res*=10;res+=c-'0';c=getchar();}return f*res;
}
int mp[8][8];
char s[150];
int t;
int dx[9]={0,-1,-2,-2,-1,1,2,2,1},dy[9]={0,-2,-1,1,2,2,1,-1,-2};
int jd[7][7]={
{0,0,0,0,0,0},
{0,1,1,1,1,1},
{0,0,1,1,1,1},
{0,0,0,-1,1,1},
{0,0,0,0,0,1},
{0,0,0,0,0,0}};
int flag=0;
int calc(){int cnt=0;for(int i=1;i<=5;i++){for(int j=1;j<=5;j++){if(mp[i][j]!=jd[i][j]) cnt++;}}return cnt;
}
bool exist(int x,int y){return x>=1&&x<=5&&y>=1&&y<=5;
}
void dfs(int step,int mx,int x,int y,int pre){int o=calc();if(o==0){printf("%d\n",step);flag=1;return;}if(o+step>mx+1) return;for(int i=1;i<=8;i++){if(i==pre) continue;int nx=x+dx[i],ny=y+dy[i];if(!exist(nx,ny)) continue;swap(mp[x][y],mp[nx][ny]);dfs(step+1,mx,nx,ny,i<=4?i+4:i-4);swap(mp[x][y],mp[nx][ny]);if(flag) return;}return;
}
int x,y;
int main(){t=read();while(t--){flag=0;for(int i=1;i<=5;i++){scanf("%s",s+1);for(int j=1;j<=5;j++){char c=s[j];if(c=='1') mp[i][j]=1;else if(c=='0') mp[i][j]=0;else mp[i][j]=-1,x=i,y=j;}}for(int k=1;k<=15;k++){dfs(0,k,x,y,0);if(flag) break;}if(!flag) printf("-1\n");}return 0;
}
/*
2
5 6
XXXXXX
XZZ..X
X.XXXX
M.....
.XG...
5 6
XXXXXX
XZZ..X
X.XXXX
M.....
X.G...*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AcWing 1402. 星空之夜 1月28

AcWing 1402. 星空之夜 1月28 题意&#xff1a; 一个星群是指一组非空的在水平&#xff0c;垂直或对角线方向相邻的星星的集合。 一个星群不能是一个更大星群的一部分。 星群可能是相似的。 如果两个星群的形状、包含星星的数目相同&#xff0c;那么无论它们的朝向如何&#…

RMQ、ST表

ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构。 可重复贡献问题&#xff1a;区间按位和、区间按位或、区间 \(\gcd\) 、区间最大、区间最小等满足结合律且可重复统计的问题。 模板预处理&#xff1a;(以区间最大值为例) void pre_work() {for(int i2;i<n;i) lg…

NumSharp v0.6 科学计算库发布,新增 LAPACK 的线性库支持

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[COCI] Zamjena

连这种模拟题都能。。。orz ex&#xff0c;太恶心了&#xff01; 驰骋坑底这么久了&#xff0c;我明白了 开始吧&#xff01;我发誓&#xff0c;这个超级兵&#xff0c;我就算用小书包平A都要A了它 题目 Vlatko喜欢使用整数数组&#xff0c;他在一张纸上写下了两个数组&…

P7470-[NOI Online 2021 提高组]岛屿探险【Trie,CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P7470 题目大意 给出nnn个二元组(a,b)(a,b)(a,b)。 qqq次询问给出(l,r,c,d)(l,r,c,d)(l,r,c,d)表示询问[l,r][l,r][l,r]中有多少二元组满足cxora≤min(b,d)c\ xor\ a\leq min(b,d)c xor a≤min(b,d)。 1≤n,q≤1051\leq n,q\…

P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)

洛谷传送门 文章目录题目描述解析代码题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点&#xff0c;二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直接枚举左上方的点二分呢&#xff1f;awa 很遗憾的是… 那样答案就没有…

初赛—错题集

计算机基础知识 LAN&#xff1a;局域网&#xff0c;WAN&#xff1a;广域网&#xff0c;MAN&#xff1a;城域网 汇编语言是(依赖于具体计算机)的低级程序设计语言 计算机操作的最小时间单位是(时钟周期)。 注意所需空间需要 \(\div 8\) &#xff01;&#xff01;&#xff01;…

.NET Core 和 DevOps

关键要点无论你目前使用什么样的技术栈&#xff0c;DevOps 都是值得一试的。闭源、专有软件和构建过程与 DevOps 实践不兼容。.NET Core 是开源的&#xff0c;是基于 DevOps 构思和构建的。.NET Core CLI 和 Roslyn API 让整个交付流程变得更加开放&#xff0c;且具有更强的适应…

2021 NOI游记

文章目录前言day1总结T1 轻重边(0/50)考后得分T2 路径交点(0/20)考后得分T3 庆典(28/44)赛后得分day2总结T1 量子通信(20/12)赛后得分T2 密码箱(0/35)赛后得分T3 机器人游戏(12/12)赛后得分总结前言 62pts 太惨了 &#xff08;只是参加了同步赛而已&#xff09; 感觉心态受到了…

【每日一题】1月29日题目 和与或

题意&#xff1a; 给你一个数组R&#xff0c;包含N个元素&#xff0c;求有多少满足条件的序列A使得 0 ≤ A[i] ≤ R [ i ] A[0]A[1]…A[N−1] A[0] | ]A[1]… | A [ N − 1 ] 输出答案对1e99取模 题解&#xff1a; 参考博客 数位dp问题 如果和等于或的话&#xff0c;说明两…

Message Decoding密码翻译

这是一道模拟题ex 其实每一道模拟题都很“简单”&#xff0c; 这道题就是难在读英文题&#xff01;处理输入&#xff01; 真的我竟然花了几个小时就只是为了看懂样例&#xff01;&#xff01;orz 题目大意 考虑下面的01串序列&#xff1a; 0&#xff0c;00&#xff0c;01…

AT3945-[ARC092D]Two Faced Edges【dfs】

正题 题目链接:https://www.luogu.com.cn/problem/AT3945 题目大意 nnn个点mmm条边的一张图&#xff0c;对于每条边求它翻转后强连通分量数量是否变化。 1≤n≤1000,1≤m≤21051\leq n\leq 1000,1\leq m\leq 2\times 10^51≤n≤1000,1≤m≤2105 解题思路 对于一条(x,y)(x,y)(…

记录一些 sb 错误

记录一些 sb 错误 离散化的最小值 \(val_0\) 应该赋值为不可能达到的值( \(val_0-\infty\) )函数传参数从右到左&#xff0c;在 f(rd(),rd()) 后会反过来。连续的 if 中记得加上 else。因为在 if 中可能会改变下一个 if 的判断条件(如某一次洛谷月赛)数组不要开小啦&#xff01…

.NET Core开发日志——结构化日志

在.NET生态圈中&#xff0c;最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net。而其后来者&#xff0c;莫过于NLog。Nlog与log4net相比&#xff0c;有一项较显著的优势&#xff0c;它支持结构化日志。结构化日志&#xff0c;也被称为语义化日志。其作用有二&…

YBTOJ 特殊数列(哈希表)

文章目录题目描述解析代码题目描述 解析 应该是哈希表板子题了 选一个1e6左右的质数进行处理即可 其实本质就是链前 没啥特别新鲜的 为什么要写呢&#xff1f; 因为这个东西很早之前看的时候完全没有看懂。。。 代码 #include<bits/stdc.h> using namespace std; #def…

欧拉图、哈密顿图

欧拉图 OI-Wiki 原文 定义 通过图中所有边恰好一次且行遍所有顶点的 通路 称为欧拉通路。 通过图中所有边恰好一次且行遍所有顶点的 回路 称为欧拉回路。 具有欧拉回路 的无向图或有向图称为 欧拉图 。 具有欧拉通路但不具有欧拉回路 的无向图或有向图称为 半欧拉图 。 非形式化…

Strange Definition CodeForces - 1471D

题意&#xff1a; 定义数字 x 和 y 是“相邻”的当且仅当 lcm(x,y)/gcd(x,y) 是一个平方数。 给定一个长度为 n 的数组 a。 每过一秒&#xff0c;数组 a 会发生变化&#xff1a;ai 会变成数组 a 中与其“相邻”的所有数字的乘积。 定义 di 为数组 a 中与 ai “相邻” 的数字个…

学习三分 (概念 + 模板 + 例题:曲线)

这好像是我第一次尝试写一个新知识入门 而不是习题解 文章目录三分概念模板例题&#xff1a;曲线题目题解代码实现三分概念 我们都知道&#xff0c;二分是在一个单调函数&#xff08;即一次函数&#xff09;上通过每次查找折半的方式&#xff0c;对答案进行搜索查找。那么&am…

P3291-[SCOI2016]妖怪【凸壳】

正题 题目链接:https://www.luogu.com.cn/problem/P3291 题目大意 给出 nnn 个数字对 (atk,dnf)(atk,dnf)(atk,dnf)&#xff0c;求一个(a,b)(a,b)(a,b)。 对于每个数字对可以选择任意一个实数kkk让其变为(atkka,dnf−ka)(atkk\times a,dnf-k\times a)(atkka,dnf−ka)&#x…

迎元旦,庆surging 1.0发布

一位摄影程序员的独白每个人都有爱好&#xff0c;都有释放压力的活动&#xff0c;而我也不例外&#xff0c;我除了每天上班&#xff0c;周末就会约一群好友去拍妹子&#xff0c;成家后&#xff0c;就改为拍虫子&#xff0c;一拍就到了30岁&#xff0c;到了30岁就感觉到了中年的…