思路分析

代码实现

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. java方法里执行两条sql_Java如何在数据库上执行多个SQL命令?
  2. 语言 读ini文件_让C语言的调试更加高大上
  3. excel在线_怎么能在线免费将PDF转Excel?
  4. 与小熊、新宝不同的北鼎,仍不是小家电的出路
  5. PAT甲级 -- 1148 Werewolf - Simple Version (20 分)
  6. SSH HTTPS 公钥、秘钥、对称加密、非对称加密、 总结理解
  7. jedispool redis哨兵_通过java哨兵JedisSentinelPool代码示例连接对配置的redis哨兵主从模式进行测试验证...
  8. java多线程中出现的异常分别有哪些_java多线程试题
  9. (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
  10. OpenStack的八年之痒
  11. 【转】Python之装饰器
  12. 排序算法部分知识点小结
  13. python笔记:#010#运算符
  14. Entity Framework的简单使用之一对一关系
  15. 实现putchar put_str put_int
  16. python内置函数程序_Python入门,一定要吃透这69个内置函数
  17. Windows Embedded 7 最简便EWF系统制作方案
  18. c语言中的正号运算符,C语言 运算符
  19. 景深 (摄影测量与遥感学术语)
  20. 【北京迅为】i.MX6ULL终结者MPU6050 六轴传感器例程原理分析

热门文章

  1. 网络编程-HTTPS协议的实现原理
  2. 数据结构(哈夫曼树,哈夫曼编码)入门篇,JAVA实现
  3. java图形包_java流布局图形包
  4. 蒸汽管道图纸符号_蒸汽管道疏水阀图标怎么画法
  5. 地址转换算法 C++实现
  6. Wannafly挑战赛24 无限手套(生成函数)
  7. 点分治(简要讲解 + 模板)
  8. Matrix Decompressing UVA - 11082 最大流 + 输出方案
  9. Codeforces Round #695(Div. 2)
  10. [2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421