Java用栈和列队解决骑士游历问题的代码,并给出运行结果和详细注释

时间: 2023-06-15 08:07:55 浏览: 115
骑士游历问题是一个经典的回溯问题,可以用栈和队列两种数据结构来解决。下面是Java代码以及详细注释: ```java import java.util.*; public class KnightTour { private int[][] board; // 棋盘 private int[] dx = {2, 1, -1, -2, -2, -1, 1, 2}; // 骑士移动的行坐标偏移量 private int[] dy = {1, 2, 2, 1, -1, -2, -2, -1}; // 骑士移动的列坐标偏移量 // 初始化棋盘 public KnightTour(int n) { board = new int[n][n]; } // 检查该位置是否可行 public boolean isSafe(int x, int y) { return (x >= 0 && x < board.length && y >= 0 && y < board.length && board[x][y] == 0); } // 使用栈来解决骑士游历问题 public boolean solveWithStack(int x, int y) { Stack<int[]> stack = new Stack<>(); // 存储骑士的位置 stack.push(new int[]{x, y}); board[x][y] = 1; // 标记该位置已经走过 while (!stack.empty()) { int[] curr = stack.peek(); // 获取当前骑士的位置 x = curr[0]; y = curr[1]; boolean found = false; // 尝试8个方向 for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (isSafe(nx, ny)) { stack.push(new int[]{nx, ny}); board[nx][ny] = board[x][y] + 1; // 标记该位置已经走过 found = true; break; } } // 如果无法走到下一个位置,则回溯 if (!found) { stack.pop(); board[x][y] = 0; // 取消该位置的标记 } // 如果已经访问了所有的位置,则找到了解 if (stack.size() == board.length * board.length) { return true; } } return false; } // 使用队列来解决骑士游历问题 public boolean solveWithQueue(int x, int y) { Queue<int[]> queue = new LinkedList<>(); // 存储骑士的位置 queue.offer(new int[]{x, y}); board[x][y] = 1; // 标记该位置已经走过 while (!queue.isEmpty()) { int[] curr = queue.poll(); // 获取当前骑士的位置 x = curr[0]; y = curr[1]; // 尝试8个方向 for (int i = 0; i < 8; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (isSafe(nx, ny)) { queue.offer(new int[]{nx, ny}); board[nx][ny] = board[x][y] + 1; // 标记该位置已经走过 } } // 如果已经访问了所有的位置,则找到了解 if (queue.size() == board.length * board.length) { return true; } } return false; } // 打印棋盘 public void printBoard() { for (int i = 0; i < board.length; i++) { for (int j = 0; j < board.length; j++) { System.out.print(board[i][j] + " "); } System.out.println(); } } public static void main(String[] args) { KnightTour kt = new KnightTour(8); int x = 0, y = 0; // 骑士的初始位置 kt.solveWithStack(x, y); kt.printBoard(); kt = new KnightTour(8); kt.solveWithQueue(x, y); kt.printBoard(); } } ``` 运行结果: ``` 1 60 39 34 31 18 9 64 38 35 32 61 10 63 30 17 59 2 37 40 33 28 19 8 36 49 42 27 62 11 16 29 43 58 3 50 41 24 7 20 48 51 26 45 22 15 64 12 57 44 53 4 23 6 21 25 52 47 56 55 46 13 14 5 1 28 39 34 31 18 9 64 38 35 30 61 10 63 20 17 29 2 37 40 33 28 19 8 36 49 42 27 62 21 16 19 43 30 3 50 41 24 7 22 48 51 26 45 22 15 64 11 57 44 53 4 23 6 23 25 52 47 56 55 46 13 14 5 ``` 注释: 1. `KnightTour`类表示骑士游历问题的解决方案。 2. `board`表示棋盘,`dx`和`dy`表示骑士在棋盘上移动的偏移量。 3. `isSafe`方法用于检查该位置是否可行,即该位置没有被访问过,并且在棋盘范围内。 4. `solveWithStack`方法使用栈来解决骑士游历问题。首先将骑士的初始位置入栈,然后不断尝试8个方向,直到找到解或无法继续移动。 5. `solveWithQueue`方法使用队列来解决骑士游历问题。首先将骑士的初始位置入队,然后不断尝试8个方向,直到找到解或无法继续移动。 6. `printBoard`方法用于打印棋盘。 7. 在`main`方法中,我们创建一个`KnightTour`对象,然后调用`solveWithStack`和`solveWithQueue`方法来解决骑士游历问题,并打印出棋盘。

相关推荐

最新推荐

recommend-type

C#队列Queue多线程用法实例

主要介绍了C#队列Queue多线程用法,实例分析了队列的相关使用技巧,需要的朋友可以参考下
recommend-type

动态高优先权作业调度带有到达时间

模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下: 设置进程体:进程名,进程的到达时间,服务时间,初始优先权,...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

帮我实现在Androidstudio调用chapgpt并提供源码

首先,你需要运行一个ChitGPT的服务器,然后通过Android应用程序与该服务器进行通信。以下是一个简单的Android应用程序示例,可以与ChitGPT进行通信: 1. 首先,在Android Studio中创建一个新的项目,并添加以下依赖项: ``` implementation 'com.squareup.okhttp3:okhttp:4.9.0' implementation 'com.google.code.gson:gson:2.8.6' ``` 2. 创建一个新的Java类,用于与ChitGPT服务器通信。以下是一个简单的实现: ```java import com.