题目链接

解题思路

这道题方法很多。

我们首先思考一下,这道题只要大于15就输出-1了,然后又要让我们求最小值,显然。可以用迭代加深来搞。

我们直接枚举最小的步数即可。

但这样仅仅20分...你想嘛,如果没有任何优化,其实就跟暴力是一样的...在这里,我们引进一个乐观估计函数。

何为乐观估计函数,其实这道题就是在最优情况下达到目标图的最小步数。

就是说一定要小于等于实际步数。

如果当前步数加上乐观估计的步数依旧不行,那么就没必要继续往下面搜索了,很轻松啊。

其实有些人就会有些疑问,因为有些时候,好像自己打搜索也加了这些优化,但是却是全部都爆了。这很显然....你做的不是搜索题目....但是有剪枝优化的思想还是很好的。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n, G[10][10], sx, sy, ans;
int dir[8][2] = {{1, -2}, {2, -1}, {2, 1}, {1, 2}, {-1, 2}, {-2, 1}, {-2, -1}, {-1, -2}};//方向函数
int goal[10][10] = {{0, 0, 0, 0, 0, 0},{0, 1, 1, 1, 1, 1},{0, 0, 1, 1, 1, 1},{0, 0, 0, 2, 1, 1},{0, 0, 0, 0, 0, 1},{0, 0, 0, 0, 0, 0},
};
int check (){//乐观估计函数int sum = 0;for (int i = 1; i <= 5; i ++){for (int j = 1; j <= 5; j ++){if (goal[i][j] != G[i][j])sum ++;}}return sum;
}
bool pd (int x, int y){if (x < 1 || y < 1 || x > 5 || y > 5)return 0;return 1;
}
bool iddfs (int x, int y, int depth, int maxdep){//迭代加深if (depth == maxdep){if (! check ())return 1;return 0;}for (int i = 0; i < 8; i ++){int tox = x + dir[i][0];int toy = y + dir[i][1];if (pd (tox, toy)){swap (G[x][y], G[tox][toy]);if (check () + depth <= maxdep)if (iddfs (tox, toy, depth + 1, maxdep))return 1;swap (G[x][y], G[tox][toy]);}}return 0;
}
int main (){scanf ("%d", &n);while (n --){ans = -1;for (int i = 1; i <= 5; i ++){scanf ("\n");for (int j = 1; j <= 5; j ++){char c;scanf ("%c", &c);if (c == '*')   G[i][j] = 2, sx = i, sy = j;else G[i][j] = c - 48;}}for (int i = 0; i <= 15; i ++){if (iddfs (sx, sy, 0, i)){ans = i;break;}}printf ("%d\n", ans);}return 0;
}

这种方法固然可行,但我们还可用另一种高级搜索的方法。

题目给出了初始图和目标图,我们知道起点与终点,于是我们就可以用双向BFS,但问题来了,搜索的话我们肯定有些东西是重复进行了搜索,如何避免呢?

图是一个矩阵,我们不好进行标记,这里,我们就要考虑用到哈希。看原图,除去星号就是由01组成的,可以说是二进制编码。因此呢,我们就可以用二进制来表示。

但是会有一个问题,那就是不同的图依旧有同样的值。这里我们就需要考虑到星号的坐标,这样我们就可以保证唯一了。

我们判断一下范围,发现数值刚好卡在int那里,肯定可以算出。于是就可以用map来弄

但我们是用的2进制编码,这样其实相对来讲很难表示,如果用二维数组的话,则更难弄出来。

于是呢,我选择暴力。

我直接用3进制,这样就不会有重复了。

LL gethash(node a) {LL k = 1, ans = 0;for (int i = 1; i <= 5; i ++) {for (int j = 1; j <= 5; j ++){ans += k * a.word[i][j];k *= 3;}}return ans;
}

没啥好讲的,毕竟是搜索,相信大家都会

map<LL, edge> vis[2];这样定义好用一些。

[高级搜索]骑士精神相关推荐

  1. 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]

    骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MB [Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色 ...

  2. bzoj1085骑士精神(搜索)

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

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

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

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

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

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

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

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

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

  7. 『骑士精神 IDA*』

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

  8. BZOJ1085 [SCOI2005] 骑士精神

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

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

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

最新文章

  1. 微信小程序在showToast中换行并且隐藏icon
  2. duilib : 模态窗口
  3. 组信箱共享及挂载介绍
  4. python流行趋势_Python流行度再创新高,学Python就从风变编程开始
  5. svn强制要求提交注释
  6. array keys php,php array_keys与array_search的简单使用
  7. 前端学习(2615):数据映射map
  8. Binding是WPF的核心,WPF的常用数据源绑定有四种
  9. C++:48---纯虚函数
  10. datetime类型怎么输入_数据库之mysql的基础类型
  11. App.vue文件本质上也是js文件(javascript文件)
  12. CCF NOI1006 捡石头
  13. poj 3253 哈夫曼树 经典 运用了优先队列 总和最少
  14. 1.5.PHP7.1 狐教程-(PHP开发工具 PHPStorm 配置)
  15. Xgboost和lightgbm的区别
  16. matlab入门(适合初学者)
  17. 常用邮件客户端软件的代理服务器设置
  18. 哪款视频压缩软件比较好用?
  19. SRAM、PSRAM、SPI FLASH
  20. “GitHub: Your account has been flagged.”的解决方法

热门文章

  1. 招行信用卡微信公众号开发高级篇
  2. keyshot导入失败错误代码7_keyshot7的一些问题
  3. 中国建筑钢结构防腐涂料行业研究与投资战略报告(2022版)
  4. Invalid options object. Dev Server has been initialized using an options object that does not match
  5. 企业内容管理:中国信息化发展的加速器
  6. UG NX12 同步建模:替换面
  7. PDF去除水印的问题
  8. 你应该放弃「To-Do List」,拥抱日程表
  9. Windows操作系统添加用户账户
  10. 百度搜索下拉框与原理