传送门

文章目录

  • 解析

解析

很显然,让马走的话状态记录和转移都会比较复杂
所以转化成让空位跳会更好做一点
但这不是重点
初看本题,其实第一感觉是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...*/

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

  1. BZOJ 1085 骑士精神 迭代加深搜索+A*

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...

  2. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

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

  3. 【题解】P2324[SCOI2005] 骑士精神

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

  4. P2324 [SCOI2005]骑士精神(IDA*)

    思路:不是动骑士,而是动空格.只能动15次,证明搜索树的高的确定的,考虑IDA解决 IDA能很好地解决一些搜索中有上界的情况 大概就是搞一个估值函数,然后当前情况+估价函数>限制的情况直接剪掉这 ...

  5. 洛谷 P2324 [SCOI2005]骑士精神

    目录 题目 思路 $Code$ 题目 戳 思路 $dfs$. $Code$ #include<iostream> #include<cstdio> #include<cs ...

  6. 迭代加深搜索 C++解题报告 :[SCOI2005]骑士精神

    题目 此题根据题目可知是迭代加深搜索. 首先应该枚举空格的位置,让空格像一个马一样移动. 但迭代加深搜索之后时间复杂度还是非常的高,根本过不了题. 感觉也想不出什么减枝,于是便要用到了乐观估计函数(O ...

  7. 算法复习——迭代加深搜索(骑士精神bzoj1085)

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

  8. 搜索进阶之迭代加深搜索

    迭代加深搜索 首先这个不要怕这个东西,其实我刚开始学这个搜索也觉得特别高大上,觉得都是很高大上让人听不懂的专业术语,其实说白了迭代加深搜索的思想和精髓就是控制了搜索深度的dfs,但是却能够达到广搜的效 ...

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

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

最新文章

  1. 中文自然语言处理导论
  2. SCCM2012系列之三,SCCM2012部署前的IIS准备
  3. mac 终端快捷命令
  4. SpringBoot集成Druid不支持多条SQL
  5. 04737 c++ 自学考试2019版 第二章课后程序设计题 2
  6. qq html消息,类似于QQ新消息提醒-前端
  7. 人工智能与自动驾驶汽车_自动驾驶汽车中的道德AI
  8. 使用c语言函数的小结,C语言函数指针小结(1)
  9. 「干货分享」我所在团队的竞品分析模板--附下载
  10. xftp中文文件名乱码
  11. 《Efficient Android Threading》Chapter 3---Threads on Android (Android中的线程)
  12. T1214 鸣人和佐助——dfs、bfs
  13. Hive启动报错:java.net.URISyntaxException: Relative path in absolute URI: ${system:user.name%7D
  14. Java之Scanner类用法
  15. 2019 NIPS | Variational graph recurrent neural network
  16. 【附源码】计算机毕业设计Python安卓基于安卓的豆果美食APPou9ez(源码+程序+LW+调试部署)
  17. 2.4G无线芯片NRF24L01 驱动源码及详解
  18. 一套强大的vim配置文件+详细注释
  19. java计算机毕业设计社区电商平台系统源码+系统+数据库+lw文档+mybatis+运行部署
  20. java实列方法和静态方法_静态方法,类方法和实例方法

热门文章

  1. 不爱读书怎么办?用这个新奇的方法,熟知137亿年来的地球通史
  2. php cli swoole mysql_[了解实践]Swoole、PHP与MySQL:连接池,swoole扩展实现真正的PHP数据库连接池。...
  3. java导出mysql数据库失败_利用Java进行MySql数据库的导入和导出
  4. jpi多表联查_数据库两表联查、多表联查,多重联查
  5. 数据结构——基于 Dijsktra 算法的最短路径求解
  6. leetcode199. 二叉树的右视图(层序遍历03)
  7. 栈的基础概念与经典题目(Leetcode题解-Python语言)
  8. 地理生物高考成绩查询2021,2021北京中考地理生物成绩查询时间【已公布】
  9. [Spring5]IOC容器_Bean管理XML方式_注入集合类型属性
  10. Java StringBuffer 方法