思路分析

代码实现

package com.atguigu.horse;import java.awt.*;
import java.util.ArrayList;
import java.util.Comparator;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];//初始值都是false//测试一下耗时long 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 step:rows){System.out.print(step+"\t");}System.out.println();}}/*** 完成骑士周游问题的算法* @param chessboard 棋盘* @param row 马儿当前的位置的行 从0开始* @param column 马儿当前的位置的列 从0开始* @param step 是第几部,初始位置就是第一步*/public static void traversalChessboard(int[][] chessboard,int row,int column,int step){chessboard[row][column]=step;visited[row*x+column]=true;//笔记该位置已经访问//获取当前位置可以走的下一个位置的集合ArrayList<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对象),计算马儿还能走哪些位置,并放入到一个集合中(ArrayList),最多有8个位置* @param curPoint* @return*/public static ArrayList<Point> next(Point curPoint){//创建一个ArrayListArrayList<Point> ps = new ArrayList<>();//创建一个PointPoint p1 = new Point();//表示马儿可以走5的位置if((p1.x=curPoint.x-2)>=0&&(p1.y=curPoint.y-1)>=0){ps.add(new Point(p1));}//判断马儿可以走6的位置if((p1.x=curPoint.x-1)>=0&&(p1.y=curPoint.y-2)>=0){ps.add(new Point(p1));}//判断马儿可以走7的位置if((p1.x=curPoint.x+1)<x&&(p1.y=curPoint.y-2)>=0){ps.add(new Point(p1));}//判断马儿可以走0的位置if((p1.x=curPoint.x+2)<x&&(p1.y=curPoint.y-1)>=0){ps.add(new Point(p1));}//判断马儿可以走1的位置if((p1.x=curPoint.x+2)<x&&(p1.y=curPoint.y+1)<y){ps.add(new Point(p1));}//判断马儿可以走2的位置if((p1.x=curPoint.x+1)<x&&(p1.y=curPoint.y+2)<y){ps.add(new Point(p1));}//判断马儿可以走3的位置if((p1.x=curPoint.x-1)>=0&&(p1.y=curPoint.y+2)<y){ps.add(new Point(p1));}//判断马儿可以走4的位置if((p1.x=curPoint.x-2)>=0&&(p1.y=curPoint.y+1)<y){ps.add(new Point(p1));}return ps;}//根据当前这个一步的所有的下一步的选择位置,进行非递减排序(减少回溯的次数)public static void sort(ArrayList<Point> ps){ps.sort(new Comparator<Point>() {@Overridepublic int compare(Point o1, Point o2) {//获取到o1的下一步所有位置个数int count1 = next(o1).size();//获取到o2的下一步所有位置个数int count2 = next(o2).size();return count1-count2;}});}}

马踏棋盘算法(骑士周游)相关推荐

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

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

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

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

  3. Java对马踏棋盘问题(骑士周游问题)的实现

    14.10.2 马踏棋盘游戏代码实现 马踏棋盘问题(骑士周游问题)实际上是图的深度优先搜索(DFS)的应用. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个 ...

  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. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析

    马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...

  9. 用java写的马踏棋盘算法

    用java写的马踏棋盘算法 将马随机放在国际象棋的8×8棋盘Board[0-7][0-7]的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部64个方格. 代码 /* 马踏棋盘问 ...

最新文章

  1. Jquery中替换节点的方法replaceWith()和replaceAll()
  2. 词法分析(2)---NFA
  3. 经典C语言程序100例之八二
  4. class声明为final的好处
  5. 关于udelay(); mdelay(); ndelay(); msleep();
  6. Xeogl 基于 WebGL 的 3D 引擎
  7. java gdal生成彩色tiff文件 并压缩大小
  8. Linux系统用户管理命令知识学习
  9. Canvas递归画一棵树
  10. Halcon实战之MLP颜色匹配(一)
  11. 深度linux显示方块,在Deepin下用Wine运行文华财经赢顺的经验,附字体显示方框的解决...
  12. ABO区块链在医疗行业中的重要作用
  13. Python连接多种数据库的方式
  14. 核心乐理---音程名称
  15. UNI-APP 生成海报/DOM转图片
  16. 告别单调, 给Unity编辑器换一个皮肤吧
  17. 关于数据库having的用法的详细介绍
  18. Covid-19 肺部 X 射线分类和 CT 检测演示
  19. RD算法(一)—— 算法原理
  20. show函数的作用是什么python_matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)...

热门文章

  1. linux下yum安装pgsql,CentOS7使用yum安装PostgreSQL和PostGIS的方法
  2. java(i++和++i的理解)
  3. Java BIO、NIO、AIO的区别
  4. 多项式求逆模板(NTT + mod)
  5. [2020多校A层11.18] 三角田地(因式分解)
  6. HDU - 6071 Lazy Running 同余最短路 + 分层
  7. [LG P2519][BZOJ2298][HAOI2011]problem a
  8. Educational Codeforces Round 112 (Rated for Div. 2)
  9. 数论杂谈(欧拉定理与费马小定理结论与应用)
  10. [HNOI2013]数列(差分)