题目地址:

https://www.acwing.com/problem/content/197/

在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士,且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为222或者横坐标相差为222,纵坐标相差为111的格子)移动到空位上。给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘:为了体现出骑士精神,他们必须以最少的步数完成任务。

输入格式:
第一行有一个正整数TTT,表示一共有TTT组数据。接下来有TTT个5×55×55×5的矩阵,000表示白色骑士,111表示黑色骑士,∗*∗表示空位。两组数据之间没有空行。

输出格式:
每组数据输出占一行。如果能在151515步以内(包括151515步)到达目标状态,则输出步数,否则输出−1−1−1。

数据范围:
1≤T≤101≤T≤101≤T≤10

搜索空间非常大,并且分叉特别多,状态的存储也非常耗费空间,所以可以考虑IDA*。考虑启发函数,对于当前局面,其每个马如果没有”归位“,那显然至少一步才能将其归位,所以启发函数可以取多少个马没有归位。代码如下:

#include <iostream>
using namespace std;const int INF = 1e9;
int dx[] = {1, 2, 2, 1, -1, -2, -2, -1};
int dy[] = {2, 1, -1, -2, -2, -1, 1, 2};
char g[5][5];
string goal[] = {"11111","01111","00*11","00001","00000"};int h() {int cnt = 0;for (int i = 0; i < 5; i++)for (int j = 0; j < 5; j++)if (g[i][j] != '*' && g[i][j] != goal[i][j]) cnt++;return cnt;
}int dfs(int depth, int x, int y, int max_depth, int &next_depth) {int he = h();if (!he) return depth;if (depth + he > max_depth) {next_depth = min(next_depth, depth + he);return -1;}int res;for (int i = 0; i < 8; i++) {int nx = x + dx[i], ny = y + dy[i];if (0 <= nx && nx < 5 && 0 <= ny && ny < 5) {swap(g[x][y], g[nx][ny]);// 如果搜到解了,则返回深度if (~(res = dfs(depth + 1, nx, ny, max_depth, next_depth)))return res;swap(g[x][y], g[nx][ny]);}}return -1;
}int main() {int T;scanf("%d", &T);while (T--) {for (int i = 0; i < 5; i++) scanf("%s", g[i]);int x, y;for (int i = 0; i < 5; i++)for (int j = 0; j < 5; j++)if (g[i][j] == '*') {x = i, y = j;break;}int res = -1;for (int max_depth = 0, next_depth; max_depth <= 15; max_depth = next_depth) {next_depth = INF;if (~(res = dfs(0, x, y, max_depth, next_depth))) break;}printf("%d\n", res);}return 0;
}

时空复杂度取决于具体输入。

【ACWing】195. 骑士精神相关推荐

  1. AcWing 195. 骑士精神

    双向BFS (广搜) \(O(8 ^ 7)\) 看到没有双向BFS的题解我就过来了 这道题也可以用双向\(BFS\)来做,时间复杂度与\(IDA*\)不相上下. 双向\(BFS\)的实现有多种: 把初 ...

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

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

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

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

  4. 『骑士精神 IDA*』

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

  5. BZOJ1085 [SCOI2005] 骑士精神

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

  6. [luogu 2324][SCOI 2005] 骑士精神 (A*算法)

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

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

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

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

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

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

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

最新文章

  1. 15 上下篇博客和按月分类
  2. python pytest测试框架介绍四----pytest-html插件html带错误截图及失败重测机制
  3. axios02-其他使用方式(推荐)
  4. java入门从哪下手_java新手0基础如何最快速的入门
  5. java oo原则_javaOO11-12:面向对象的设计原则、线程
  6. Python 虚拟环境安装 ,避免影响生产环境。
  7. kafka 同步提交 异步_Kafka 位移提交那些事儿
  8. I.MX6 mfgtool2-android-mx6q-sabresd-emmc.vbs hacking
  9. 环境数据-全球中国土壤数据资源下载和提取教程
  10. 怎么在计算机上设置复印机双面打印,Word如何设置双面打印
  11. 常用的图像标注工具汇总
  12. 汉王数据导入java环境,怎样把u盆内容导入汉王门禁考勤管理软件
  13. FPN特征金字塔网络
  14. MySQL 通过 jemalloc 管理内存
  15. 软件项目管理(第二版 宁涛)问答题(个人背诵)
  16. 哦, 这该死的txt回车符~
  17. 测试必备的15个docker命令,你都掌握了吗
  18. SAP 生产订单/工单状态说明
  19. 【新书推荐】图神经网络导论,清华大学刘知远老师著作
  20. 校园的数学课会结束,但人生的数学道路将永不止步

热门文章

  1. 数据库分片(Database Sharding)
  2. 关于SEO(搜索引擎优化)的个人掌握知识分享
  3. 以太网链路聚合工作原理总结
  4. win10不兼容中文版的vc++ 6.0解决办法
  5. JSON基础和JSON的主要作用
  6. 2022年版中国制冷设备市场深度分析与投资调研评估报告报告
  7. uboot 或者 linux 下限制 sata speed
  8. 第三章 数字化转型的概念,技术框架及意义
  9. 360杀毒属于计算机操作系统吗,360杀毒软件 统一操作系统UOS,保护您的电脑安全...
  10. 怎么吃才能促进孩子长个子?