【ACWing】195. 骑士精神
题目地址:
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. 骑士精神相关推荐
- AcWing 195. 骑士精神
双向BFS (广搜) \(O(8 ^ 7)\) 看到没有双向BFS的题解我就过来了 这道题也可以用双向\(BFS\)来做,时间复杂度与\(IDA*\)不相上下. 双向\(BFS\)的实现有多种: 把初 ...
- 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]
骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB [Submit][Status][Discuss] Description 在一个5×5的棋盘上有12个白色 ...
- [启发式搜索/A*] [SCOI2005]骑士精神题解
洛谷-骑士精神 启发式搜索-A* 估价函数 对于当前状态,我们可以将其与目标状态对比,得到一个预估的代价,即最少(不一定满足题意)的代价,得到这个代价的函数叫做估价函数 对于一个最短路问题来说,我们可 ...
- 『骑士精神 IDA*』
骑士精神(SCOI2005) Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵 ...
- BZOJ1085 [SCOI2005] 骑士精神
[问题描述] 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相 ...
- [luogu 2324][SCOI 2005] 骑士精神 (A*算法)
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...
- 洛谷 P2324 [SCOI2005]骑士精神 解题报告
P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...
- BZOJ 1085 [SCOI2005]骑士精神 【A*启发式搜索】
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2838 Solved: 1663 [Submit][St ...
- 埃及分数The Rotation Game骑士精神——IDA*
IDA*:非常好用的搜索,可以解决很多深度浅,但是规模大的搜索问题. 估价函数设计思路:观察一步最多能向答案靠近多少. 埃及分数 题目大意: 给出一个分数,由分子a 和分母b 构成,现在要你分解成一系 ...
最新文章
- 15 上下篇博客和按月分类
- python pytest测试框架介绍四----pytest-html插件html带错误截图及失败重测机制
- axios02-其他使用方式(推荐)
- java入门从哪下手_java新手0基础如何最快速的入门
- java oo原则_javaOO11-12:面向对象的设计原则、线程
- Python 虚拟环境安装 ,避免影响生产环境。
- kafka 同步提交 异步_Kafka 位移提交那些事儿
- I.MX6 mfgtool2-android-mx6q-sabresd-emmc.vbs hacking
- 环境数据-全球中国土壤数据资源下载和提取教程
- 怎么在计算机上设置复印机双面打印,Word如何设置双面打印
- 常用的图像标注工具汇总
- 汉王数据导入java环境,怎样把u盆内容导入汉王门禁考勤管理软件
- FPN特征金字塔网络
- MySQL 通过 jemalloc 管理内存
- 软件项目管理(第二版 宁涛)问答题(个人背诵)
- 哦, 这该死的txt回车符~
- 测试必备的15个docker命令,你都掌握了吗
- SAP 生产订单/工单状态说明
- 【新书推荐】图神经网络导论,清华大学刘知远老师著作
- 校园的数学课会结束,但人生的数学道路将永不止步