Description

像骑士的忠贞 
不畏惧邪恶的眼神 
这过程一直放在我心底就像 
挡在你胸前的盔甲 
保护着我让我心疼 
骑士们发挥出你们的精神 
就这样强悍的骑士撑到最后 
骄傲的公主的要回家整装再出发。 

这是蔡依林的歌曲骑士精神,听歌归听歌,题还是得做。题目要求在一个5×5的棋盘上放12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。 给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。

Input

第一行有一个正整数T(T <= 10) 表示一共有T组数据 接下来有T个5*5的矩形。0表示白色骑士1表示黑色骑士,*表示空位。(每组数据间有空行)

Output

对每组数据都输出一行。如果能在10步以内(包括10)到达目标状态,则输出步数,否则输出-1。

Sample Input

2
10110
01*11
10111
01001
0000001011
110*1
01110
01010
00100

Sample Output

7
-1

思路:

其实这题我以前是不会的,以前没有系统的学习过相关知识,所以大概只知道是搜索方面的题,具体怎么做不知道。

后来才知道是迭代加搜索。

“迭代加深搜索(Iterative Deepening Depth-First Search, IDDFS)经常用于理论上解答树深度上没有上界的问题,这类问题通常要求出满足某些条件时的解即可。”

进一步理解之前,我们先比较下深搜,广搜,和迭代加深搜。

深度优先搜索(DFS):

算法总是能尽可能快的抵达搜索树的底层。

n 皇后问题的空间复杂度为 O(n)。如果搜索树有 d 层,每个节点有 c 个子节点,时间复杂度与c^d成正比。

广度优先搜索(BFS):

每次都先将搜索树某一层的所有节点全部访问完毕后再访问下一层。

广度优先搜索的空间复杂取决于每层的节点数。如果搜索树有 k 层,每个节点有 c 个子节点,那么最后将可能有 c^k 个数据被存入队列

迭代加深搜索(ID):

广度优先搜索可以用迭代加深搜索代替。迭代加深搜索实质是限定下界的深度优先搜索,即首先允许深度优先搜索搜索 k 层搜索树,若没有发现可行解,再将 k+1 后再进行一次以上步骤,直到搜索到可行解。这个“模仿广度优先搜索”搜索法比起广搜是牺牲了时间,但节约了空间。

具体怎么操作呢?

迭代加深搜索是通过限制每次dfs的最大深度进行的搜索。令maxd表示最大的搜索深度,那么dfs就只能在0~maxd之间来进行,如果在这个范围内找到了解,就退出大循环,否则maxd++,扩大搜索范围。但可想而知,倘若没有高效及时的退出无解的情况,那么时间上的开销也是会比较大的。这时就需要进行“剪枝”操作,及时地判断此时能否找到解。对于迭代加深搜索,经常通过设计合适的“乐观估价函数”来判断能否剪枝。设当前搜索的深度是cur,乐观估价函数是h(),那么当cur+h()>maxd时就需要剪枝。

顺便提以下乐观估计函数:简单的说就是从当前深度到找到最终的解“至少”还需要多少步,或者距离找到最终的解还需要扩展多少层。如果超出了当前限制的深度maxd,说明当前限制的最大深度下是不可能找到解的,直接退出。

暂时理解那么多,再看题目就很明显了,尝试用迭代加深搜的办法去解。
#include <cstdio>
#include <algorithm>
using namespace std;
int find1 = 0;
int a[5][5];
int target[5][5]= {   {1,1,1,1,1},   {0,1,1,1,1},   {0,0,2,1,1},   {0,0,0,0,1},   {0,0,0,0,0}
};
int dx[]={1, 1, -1, -1, 2, 2, -2, -2};
int dy[]={2, -2, 2, -2, 1, -1, 1, -1};
int dis() {  int v = 0;  for(int i = 0; i < 5; i++)  for(int j = 0; j < 5; j++) {  if(a[i][j] != target[i][j])  v++;  }  return v;
}
void dfs(int x, int y, int s, int k) {    if(s == k) {   if(dis() == 0) {   find1 = 1;   }   return;   }   for(int i = 0; i < 8 ; i++) {   int nx = x + dx[i];   int ny = y + dy[i];   if(nx < 0 || nx > 4 || ny < 0 || ny > 4) continue;   swap(a[x][y], a[nx][ny]);   if(s + dis() <= k ) {  //用乐观估价函数判断能否剪枝. dfs(nx, ny, s + 1, k);   }  swap(a[x][y], a[nx][ny]);   }
}
int main() {  int n, sx, sy, k; char ch; scanf("%d",&n);  while(n--){   for(int i = 0; i < 5; i++)   for(int j = 0; j < 5; j++) {   scanf(" %c", &ch);  if(ch  == '*') {   a[i][j] = 2;   sx = i;   sy = j;   }   else a[i][j] = ch - '0';   }   for(k = 0; k <= 10; k++) {//迭代加深搜索 判断能不能在10步内搞定     dfs(sx, sy, 0, k);   if(find1) break;   }   printf("%d\n",k > 10 ? -1 : k);   find1 = 0;   getchar();  }  return 0;
} 

骑士精神 (迭代加深)相关推荐

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

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

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

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

  3. C++高级搜索算法迭代加深—————骑士精神

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

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

    传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...

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

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

  6. [启发式搜索/A*] [SCOI2005]骑士精神题解

    洛谷-骑士精神 启发式搜索-A* 估价函数 对于当前状态,我们可以将其与目标状态对比,得到一个预估的代价,即最少(不一定满足题意)的代价,得到这个代价的函数叫做估价函数 对于一个最短路问题来说,我们可 ...

  7. 『骑士精神 IDA*』

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

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

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

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

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

  10. bzoj1085骑士精神(搜索)

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1893  Solved: 1051 Description ...

最新文章

  1. 老树发新芽 靠PS之类的软件,上市30年的Adobe股价创新高
  2. C# main函数的返回值 - 译
  3. 让NVIDIA Jetson AGX Xavier火力全开的秘密
  4. 信息安全系统设计基础第二周学习总结
  5. S3C6410和S5PV210的启动模式介绍
  6. 2021-09-03101. 对称二叉树
  7. Centos7 安装编译nbd模块步骤
  8. 在OBS中解决无法录制chrome的问题
  9. 2022腾讯云学生云服务器申请攻略(25岁以下免学生认证)
  10. Laravel:关于with用法 OneByOne 关联(避坑)
  11. Excel绘制折线图_基础整理
  12. android q状态栏,用腻了导航栏?在一加Android Q beta中强行开启全面屏手势
  13. echarts旭日图数据重构处理
  14. jQuery的jsTree入门使用
  15. App推广如何快速实现,这些方法能帮你
  16. 工业互联网背景下的高炉炉体三维热力图监控系统
  17. PIR独立需求计划创建修改_SAP刘梦_新浪博客
  18. java g1 详解_JAVA垃圾收集算法总结以及CMS、G1算法详解
  19. linux与windows安全性,Linux与Windows安全性比较.doc
  20. QCC51XX-QCC30XX系列开发教程(实战篇) 之 9.14-DTS详解

热门文章

  1. linux系统的系统命令大全,linux系统命令大全
  2. 《荔枝架构实践与演进历程》阅读有感
  3. Java短信邮箱消息发送从零开始,一篇解决一切乌漆嘛黑的问题
  4. 计算机怎么看事件管理,用事件查看器查看电脑使用记录
  5. lzy的游戏【思维分析】【背包】
  6. emqx速度_速率限制
  7. 今天16:00 | 中科院计算所研究员孙晓明老师带大家走进量子的世界
  8. ubuntu:beyond compare 4 This license key has been revoked 有效解决方案
  9. 区分英文句号和数字中的正则表达式
  10. python删除列表第一个,在Python中删除列表的第一个元素