14.10.2 马踏棋盘游戏代码实现

  1. 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用。
  2. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个,坐标(1,0),发现已经走到尽头,没办法,那就只能回退了,查看其他的路径,就在棋盘上不停的回溯…… ,思路分析+代码实现
  • 对第一种实现方式的思路图解
  1. 分析第一种方式的问题,并使用贪心算法(greedyalgorithm)进行优化。解决马踏棋盘问题。
    不使用贪心算法,要回溯的太多,效率太低。
  2. 使用前面的游戏来验证算法是否正确。
  3. 代码实现
import java.awt.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;/*** @author zk* @version 1.0.0* @ClassName HorseChessboard.java* @Description TODO 骑士周游算法(马踏棋盘算法)* @createTime 2021年10月03日 16:19:00*/
public class HorseChessboard {private static int X; // 棋盘的横坐标,也可以说是数组的列private static int Y; // 棋盘的列坐标,也可以说是数组的行//创建一个数组,标记棋盘的各个位置是否被访问过private static boolean visited[];//使用一个属性,标记是否棋盘的所有位置都被访问private static boolean finished; // 如果为 true,表示成功public static void main(String[] args) {X = 8;Y = 8;int row = 1; //马儿初始位置的行,从 1 开始编号int column = 1; //马儿初始位置的列,从 1 开始编号int[][] chessboard = new int[X][Y];visited = new boolean[X * Y]; // 初始值都是 falselong start = System.currentTimeMillis();traversalChessboard(chessboard, row - 1, column - 1, 1);long end = System.currentTimeMillis();System.out.println("回溯算法耗时:"+(end-start));for (int[] rows : chessboard) {for (int col : rows) {System.out.print(col+"\t");}System.out.println();}}/*** 完成骑士周游问题的算法** @param chessboard 棋盘* @param row        马儿当前的位置的行 从 0 开始* @param column     马儿当前的位置的列 从 0 开始* @param step       是第几步 ,初始位置就是第 1 步*/public static void traversalChessboard(int[][] chessboard, int row, int column, int step) {chessboard[row][column] = step;visited[row * X + column] = true; //标记该位置已经访问//获取当前位置可以走的下一个位置的集合List<Point> ps = next(new Point(column, row));// ↓优化//对 ps 进行排序,排序的规则就是对 ps 的所有的 Point 对象的下一步的位置的数目,进行非递减排序sort(ps);// ↑优化//遍历 pswhile (!ps.isEmpty()) {Point p = ps.remove(0); //取出下一个可以走的位置,并且从集合中删除//判断该点是否已经访问过if (!visited[p.y * X + p.x]) { //说明还没有访问过traversalChessboard(chessboard, p.y, p.x, step + 1);}}//判断马儿是否完成了任务,使用 step 和应该走的步数比较//如果没有达到数量,则表示没有完成任务,将整个棋盘置 0//说明: step < X * Y 成立的情况有两种//1. 棋盘到目前位置,仍然没有走完//2. 棋盘处于一个回溯过程if (step < X * Y && !finished) {chessboard[row][column] = 0;visited[row * X + column] = false;} else {finished = true;}}/*** 功能: 根据当前位置(Point 对象),计算马儿还能走哪些位置(Point),并放入到一个集合中(ArrayList), 最多* 有 8 个位置** @param curPoint* @return*/public static List<Point> next(Point curPoint) {ArrayList<Point> ps = new ArrayList<>();Point p = new Point();// 判断马儿可以走 5 这个位置if ((p.x = curPoint.x - 2) >= 0 && (p.y = curPoint.y - 1) >= 0) {ps.add(new Point(p));}// 判断马儿可以走 6 这个位置if ((p.x = curPoint.x - 1) >= 0 && (p.y = curPoint.y - 2) >= 0) {ps.add(new Point(p));}// 判断马儿可以走 7 这个位置if ((p.x = curPoint.x + 1) < X && (p.y = curPoint.y - 2) >= 0) {ps.add(new Point(p));}// 判断马儿可以走 0 这个位置if ((p.x = curPoint.x + 2) < X && (p.y = curPoint.y - 1) >= 0) {ps.add(new Point(p));}// 判断马儿可以走 1 这个位置if ((p.x = curPoint.x + 2) < X && (p.y = curPoint.y + 1) < Y) {ps.add(new Point(p));}// 判断马儿可以走 2 这个位置if ((p.x = curPoint.x + 1) < X && (p.y = curPoint.y + 2) < Y) {ps.add(new Point(p));}// 判断马儿可以走 3 这个位置if ((p.x = curPoint.x - 1) >= 0 && (p.y = curPoint.y + 2) < Y) {ps.add(new Point(p));}// 判断马儿可以走 4 这个位置if ((p.x = curPoint.x - 2) >= 0 && (p.y = curPoint.y + 1) < Y) {ps.add(new Point(p));}return ps;}//根据当前这个一步的所有的下一步的选择位置,进行非递减排序, 减少回溯的次数public static void sort(List<Point> ps){ps.sort(new Comparator<Point>() {@Overridepublic int compare(Point o1, Point o2) {return next(o1).size()-next(o2).size();}});}
}

Java对马踏棋盘问题(骑士周游问题)的实现相关推荐

  1. 马踏棋盘算法(骑士周游问题)

    要求: 国家棋盘为8*8的方格棋盘,将"马"放在任意指定方格中.最终让马走遍64个方格. 关于象棋中马的走法 如下图所示: 下面是代码: #include <stdio.h& ...

  2. 马踏棋盘算法(骑士周游)

    思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util. ...

  3. 马踏棋盘算法(骑士周游)+贪心优化

    思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util. ...

  4. 【算法】马踏棋盘算法 骑士走周游算法

    文章目录 1.概述 2.贪心优化 1.概述 马踏棋盘算法和八皇后问题很相似:[算法]八皇后问题 骑士周游问题的解决步骤和思路 创建棋盘chessBoard,是一个二维数组 将当前位置设置为已经访问,然 ...

  5. java 马踏棋盘优化_我所知道的十大常用算法之马踏棋盘算法(深度搜索、贪心思想优化 )...

    前言需求 今天我们学习的是马踏棋盘算法,我们还是从一个场景里引入看看 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的6×6棋盘Board0-5的某个方格中 提示:马按走棋规则(马走日字)进行 ...

  6. Day600601.马踏棋盘算法 -数据结构和算法Java

    马踏棋盘算法 图的深度优先DFS 回溯 八皇后问题.小老鼠找迷宫问题 一.介绍 二.思路分析 三.代码实现 package com.achang.algorithm;import java.awt.* ...

  7. 数据结构(七)——Dijkasta 、Flyod、马踏棋盘算法

    Dijkstra 算法 应用场景-最短路径问题 有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到A, B, C , D, E, F 六 ...

  8. 残缺棋盘问题算法分析_javascript使用递归回溯算法和贪心算法解决马踏棋盘问题...

    马踏棋盘算法介绍和游戏演示 1.马踏棋盘算法也被称为骑士周游问题 2.将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一 ...

  9. c语言数据结构之马踏棋盘

    c语言数据结构之马踏棋盘 马踏棋盘游戏 (一)思路: 马随机放在国际象棋的 8×8 棋盘 Board[07][07]的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部 64 个 ...

最新文章

  1. linux中的fork函数详解
  2. 如何在Epower工作流平台(企业流程管理平台)上建立OA系统
  3. 用JavaScript实现简单的excel列转sql字符串
  4. 清华大学计算机专业在职博士吧,我将我的清华大学考博经验分享
  5. Redis客户端命令行redis-cli操作
  6. mariadb 最新精简压缩版 win64 解压即用
  7. 【JAVA 第四章 流程控制语句】课后习题 判断两个圆是否相交 圆和直线的位置关系
  8. c ringbuffer 源码_Python Ring Buffer的实现
  9. 【图像处理】H.264开源解码器评测
  10. ubuntu 下openkore的运行
  11. 多开2000人QQ群技术是骗人的,完全不可行,你当腾讯技术是菜鸟?
  12. TextView控件的使用(KongJian)
  13. Verilog中$finish和$stop的区别
  14. 绕过AppLocker系列之弱路径规则的利用
  15. JavaScript实现外溢动态的心
  16. Linux 安装VMware Tools(open-vm-tools)实现桌面全屏、跨平台复制等功能
  17. 重绘、重排区别如何避免
  18. 服务器cpu配什么主板稳定,至强E3 1230V5配什么主板好 适合E3 1230 V5搭配的主板推荐...
  19. 计算机管理器用户怎么打开文件,资源管理器怎么设置默认打开我的电脑
  20. 最新手机枰测出炉 iPhone X仅仅名列第9名

热门文章

  1. 清除“全能车”这颗“毒瘤”,共享单车再出发
  2. Excel中如何进行快速单位换算
  3. iOS safeAreaInsets安全区域相关知识
  4. JS实现b站动态评论区抽奖(含去重)
  5. linux系统下以存储从大到小并以K,M,G为单位的方式查看当前目录下的文件信息
  6. 俞敏洪:忍受孤独,失败,屈辱的能力是成就大业的必备条
  7. 百度地图 路书动态加载规划
  8. 香叶是什么,怎么用?
  9. 电子专业英语(持续更新)
  10. V4L2图像采集+图片格式转换(YUYV、RGB、JPEG)