描述 在一个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. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入
  2. 机器学习大神迈克尔 · 乔丹:我讨厌将机器学习称为AI
  3. navigating the online library
  4. ASP.NET MVC3 技术(二) WebGrid 的使用方法
  5. 在html中三个图片切换,轻松搞定网页中的图片切换
  6. C#中ManualResetEvent用法简介
  7. 戴尔集群监控与管理系统_监控与管理
  8. 版本号控制-GitHub
  9. C语言——循环控制语句
  10. 一文看懂卷积神经网络
  11. php pdo 错误信息,PHP的PDO错误与错误处理
  12. STM32工作笔记0055---认识pcbdoc文件Schdoc文件
  13. 关于信道利用率的总结与一道习题的最终解释
  14. AI技术如何做工程?
  15. 员工提出离职时,再挽留已经迟了
  16. vs2019,C#,MySQL创建图书管理系统3(管理员相关页面的布局和设计实现,图书显示,图书添加)
  17. 计算机程序漏洞用英语怎么说,安全漏洞的英文
  18. 【财经期刊FM-Radio|2021年03月04日】
  19. 小白入门spring——IOC依赖注入
  20. webpack构建中tree shaking、scope Hoisting(面试题)

热门文章

  1. 关闭默认共享-关于Windows的默认共享介绍
  2. 华东师范大学2020计算机研究生招生简章,2020华东师范大学计算机考研大纲
  3. RGGEDU-Rob Grimm静物食物美食菜谱摄影技巧与后期-中文字幕
  4. 局域网ip冲突检测工具_只需一台Android设备就能打通局域网内部通讯:文字聊天与文件传输...
  5. 激光认证,激光安全等级认证,激光安全认证,激光等级认证,激光FDA认证。
  6. Windows如何安装Clouda
  7. Clouda框架开发留言板实例
  8. 微信小程序通过BLE低功耗蓝牙向USB HID键盘设备输出汉字(内含GBK编码转汉字)
  9. 2018-2019-2 20189201 《网络攻防实践》第八周作业
  10. 使用虚拟光驱显示函数不正确的解决