Java 中的骑士巡游问题2025年5月14日 | 阅读 4 分钟 骑士巡游问题是回溯算法的一个著名实例。它涉及到让一个骑士在棋盘上移动,以便它恰好访问每个格子一次。给定一个 (n 乘以 n) 的棋盘和一个起始位置,目标是移动骑士,使其覆盖所有格子而不重复。 这个问题可以通过回溯来解决,我们在其中测试每一种可能的移动,如果一种移动能够导向解决方案,就继续进行;否则,我们就回溯以尝试另一条路径。 问题陈述国际象棋中的骑士以“L”形移动,在一个方向(垂直或水平)上移动两个格子,然后向初始移动的垂直方向移动一个格子。根据格子的位置,骑士最多可以进行八种移动。骑士巡游问题要求我们创建一个路径,能够遍历每个格子一次。这可以通过以下方式实现:
使用回溯解决骑士巡游问题的 Java 代码文件名:KnightsTour.java 输出 0 59 38 33 30 17 8 63 37 34 31 60 9 62 29 16 58 1 36 39 32 27 18 7 35 48 41 26 61 10 15 28 42 57 2 49 40 23 6 19 47 50 45 54 25 20 11 14 56 43 52 3 22 13 24 5 51 46 55 44 53 4 21 12 解释解决骑士巡游问题的 Java 代码通过初始化一个 N×N 的棋盘,其中每个单元格都设置为 -1,表示尚未被访问。骑士从左上角开始,其 8 种可能的移动定义在 moveX 和 moveY 数组中。solveKTUtil 函数使用递归和回溯来依次尝试每种移动。 如果一个移动是有效的(在边界内且未被访问),骑士会用当前的移动计数标记它,然后递归地尝试下一个移动。如果一个移动没有导向解决方案,骑士会通过将该单元格重置为 -1 来回溯,并尝试另一个移动。 这个过程会一直持续,直到骑士覆盖了所有格子(找到了解决方案),或者所有的选择都被耗尽(在这种情况下没有解决方案)。如果找到了解决方案,printSolution() 函数会显示巡游路径,显示每个格子被访问的顺序。 复杂度分析该算法的时间复杂度为 (O(8^N * N)),因为每个格子都可能导致八次递归调用,从而导致指数增长。然而,剪掉超出边界或指向已访问格子的移动会显著减少实际运行时间。空间复杂度为 (O(N^2)),用于存储棋盘和递归调用栈。 结论骑士巡游问题是一个经典的示例,说明了回溯问题,其中尝试每一步移动,如果导致死胡同则进行撤销。尽管理论上复杂度很高,但回溯对于这种有约束的解决方案是有效的。 虽然沃恩斯多夫规则等改进可以通过优先选择前向选择较少的移动来进一步优化性能,但仅使用递归回溯方法对于中等尺寸的棋盘来说通常已经足够,使其成为算法设计中一个高效且具有教育意义的问题解决示例。 下一主题Java 中的业务棋盘问题 |
双重花括号初始化是 Java 中一种用于以简洁方便的方式初始化类实例并为其字段提供初始值的一种技术。它涉及在实例化代码块中使用嵌套花括号。尽管这种方法可以...
阅读 4 分钟
在直接进入“阻塞队列”主题之前,让我们先简要了解一下队列。队列是对象的有序列表,其中插入发生在列表的尾部,删除发生在列表的前端。因此,它是...
14 分钟阅读
在 Java 编程中,确定两个矩阵是否是彼此的镜像图像涉及按相反的顺序比较对应元素。当一个矩阵的行或列是另一个矩阵对应行或列的倒置版本时,该矩阵被认为是另一个矩阵的镜像图像……
阅读 6 分钟
IntSummaryStatistics 类是 java.util.package 中最重要的类之一。它提供了一组整数对象,这些对象在处理整数流时使用。它会保留已处理整数的数量、它们的总和……
7 分钟阅读
在计算机编程领域,最大乘积子数组问题是一个常见的挑战,它要求在整数数组中找到具有最大乘积的连续子数组。这个问题可以使用动态规划技术有效地解决。在本文中,我们将……
阅读 4 分钟
?在 Java 中,我们可以使用 Calendar 或 LocalDate 类向当前日期添加 6 个月。在本节中,我们将讨论这两种方法,并展示如何在 Java 代码中实现日期类。使用 Calendar 类 Calendar 类是一个遗留类,它被引入...
阅读 4 分钟
大小为 s 的数组称为美丽数组,如果它遵循以下三个条件:条件 1:数组的每个元素必须大于或等于 1 且小于或等于 s,即在 1 到 s(大小为...)之间。
阅读 19 分钟
在 Java 中,String 是一个使用广泛的类,它表示字符序列。Java 中的 String 是不可变的,这意味着一旦创建了 String 对象,它的值就不能被改变。要了解更多 Java String 任何修改都会导致创建新的 String 对象……
阅读 8 分钟
在本节中,我们将讨论什么是“有害数”,并创建 Java 程序来检查给定的数字是否是“有害数”。“有害数”程序经常在 Java 编码面试和学术中出现。“有害数” 如果一个数字中 1 的总数……
阅读 4 分钟
基于 Java 的智慧城市项目充当基础应用程序,展示了交通服务、医院信息、教育机构和安全设施的关键城市数据。游客以及新居民会发现此项目有助于获取重要的城市相关信息。基于 Java 的系统使用 Java...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India