描述 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士,
且有一个空位。在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。
给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务,若果步数大于15,返回-1。
目标棋盘是 “11111” “01111” “00*11” “00001” “00000”

解法:

  1. 问题等价于从最终状态经过15步是否能达到起始状态。
  2. 状态用数字表示。
  3. BFS搜索
  4. 在最后步数过高的情况下,能到达的状态是指数级增加的。但是,如果状态和起始状态相差位数比剩余步数大太多就可以排除。
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. 骑士精神相关推荐

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

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

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

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

  3. 『骑士精神 IDA*』

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

  4. BZOJ1085 [SCOI2005] 骑士精神

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

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

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

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

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

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

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

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

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

  9. bzoj1085骑士精神(搜索)

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

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

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

最新文章

  1. OCI读取单条记录(C)
  2. 【控制】《自动控制原理》胡寿松老师-第5章-线性系统的频域分析法
  3. JAVA数据类型与逻辑练习
  4. QT 托盘图标退出延迟解决方案
  5. 用python公众号开书城步骤_资源 | 开放Python书籍:一本短小精悍的初学者入门指南...
  6. c语言定义数组变量初始化为0,c语言数组初始化——int a[N] = {0};
  7. conv2d的输入_pytorch1.0中torch.nn.Conv2d用法详解
  8. 嵌入式linux下网卡设备驱动与网络协议栈的设计实现.pdf,嵌入式系统的通用网络驱动模型设计与实现.pdf...
  9. React Native Fetch封装那点事...
  10. vue父子组件间传值(props)
  11. linux 查看进程与端口以及内存资源
  12. FishC笔记—33 讲 异常处理:你不可能总是对的2
  13. 程序员软件工程常用的画图软件推荐
  14. 服务器wifi无线放大器,无线wifi中继放大器的使用方法
  15. Windows如何ping端口
  16. 各种IT学习视频和资料
  17. LitsModer —— 开发日志(上)
  18. rm ,rm -rf , rm -f 以及rm 命令的其他参数命令
  19. python实现屏幕截图
  20. 全国平均工资水平排序 北京上海西藏居前三名

热门文章

  1. bugly android升级,Bugly升级SDK适配Android N
  2. 求知以解惑 温故而知新 ——重读哥德尔之一(开篇)
  3. 大学教师与大学学生的彼此期望
  4. 难以忽视的真相:谈及利润,iPhone‘独孤求败’
  5. WORD文本框和文本框之间,文本框和文字相互不覆盖
  6. cordova不是内部或外部命令的解决方案
  7. B站网页下载视频(flv格式)
  8. Apache Geronimo 监控
  9. 微信ipad协议简述
  10. NR的SSB子载波间隔讨论——为何无60kHz