1754. 骑士精神
描述 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,
且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。
给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务,若果步数大于15,返回-1。
目标棋盘是 “11111” “01111” “00*11” “00001” “00000”
解法:
- 问题等价于从最终状态经过15步是否能达到起始状态。
- 状态用数字表示。
- BFS搜索
- 在最后步数过高的情况下,能到达的状态是指数级增加的。但是,如果状态和起始状态相差位数比剩余步数大太多就可以排除。
class Solution:"""@param a: the Initial state@return: the fewest steps to complete the task"""def getSteps(self, a):# Write your code hereGoal = [[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]]x, y = -1, -1P = [1] * 25for i in range(1, 25): P[i] = 10 * P[i-1]A = [[0] * 5 for _ in range(5)]for i in range(5):for j in range(5):if a[i][j] == '*':A[i][j] = 2x, y = i, jif a[i][j] == '1':A[i][j] = 1if a[i][j] == '0':A[i][j] = 0def trans(A):ret = 0for i in range(5):for j in range(5):ret += P[i*5+j] * A[i][j]return retdef swap(Q, rem):nQ = []for state,x, y in Q:for dx, dy in [[1,2],[1,-2], [-1,2],[-1, -2], [2, 1], [2,-1], [-2, 1],[-2, -1]]:nx, ny = x + dx, y + dyif 0 <= nx < 5 and 0 <= ny < 5:digit = state // P[5*nx+ny] % 10nstate = state - 2 * P[5*x + y] + 2 * P[5*nx + ny] + digit * P[5*x + y] - digit * P[5*nx + ny]if nstate not in vis and diff_bit(target, nstate) - 1 <= rem:vis.add(nstate)nQ.append((nstate,nx, ny))return nQdef diff_bit(s1, s2): ret = 0for _ in range(25):if s1 % 10 != s2 % 10:ret += 1s1 //= 10s2 //= 10return ret target = trans(Goal)if target == trans(A): return 0vis = {trans(A)}Q = [(trans(A), x, y)]for i in range(1, 16):nQ = swap(Q, 15 - i)vis |= set(nQ)if target in vis:return iQ = nQreturn -1if __name__ == "__main__":G = ["10110","01*11","10111","01001","00000"]print(Solution().getSteps(G))
1754. 骑士精神相关推荐
- 【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 构成,现在要你分解成一系 ...
- bzoj1085骑士精神(搜索)
1085: [SCOI2005]骑士精神 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1893 Solved: 1051 Description ...
- 算法复习——迭代加深搜索(骑士精神bzoj1085)
题目: Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标 ...
最新文章
- OCI读取单条记录(C)
- 【控制】《自动控制原理》胡寿松老师-第5章-线性系统的频域分析法
- JAVA数据类型与逻辑练习
- QT 托盘图标退出延迟解决方案
- 用python公众号开书城步骤_资源 | 开放Python书籍:一本短小精悍的初学者入门指南...
- c语言定义数组变量初始化为0,c语言数组初始化——int a[N] = {0};
- conv2d的输入_pytorch1.0中torch.nn.Conv2d用法详解
- 嵌入式linux下网卡设备驱动与网络协议栈的设计实现.pdf,嵌入式系统的通用网络驱动模型设计与实现.pdf...
- React Native Fetch封装那点事...
- vue父子组件间传值(props)
- linux 查看进程与端口以及内存资源
- FishC笔记—33 讲 异常处理:你不可能总是对的2
- 程序员软件工程常用的画图软件推荐
- 服务器wifi无线放大器,无线wifi中继放大器的使用方法
- Windows如何ping端口
- 各种IT学习视频和资料
- LitsModer —— 开发日志(上)
- rm ,rm -rf , rm -f 以及rm 命令的其他参数命令
- python实现屏幕截图
- 全国平均工资水平排序 北京上海西藏居前三名