java数据结构与算法之马踏棋盘

 更新时间:2022年02月15日 08:33:45   作者:Nobody A  
这篇文章主要为大家详细介绍了java数据结构与算法之马踏棋盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java数据结构与算法之马踏棋盘的具体代码,供大家参考,具体内容如下

  • 马踏棋盘算法也被称为骑士周游问题
  • 将马随机放在过期象棋的8x8棋盘的某个方格中,马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格

骑士周游问题结局步骤和思路

1.创建棋盘chessBoard,是一个二维数组
2.将当前位置设置为已个访问,然后根据当前位置,计算马儿还能走那些位置,并放到一个集合中(ArrayList),最多8个位置
3.变量ArrayList存放的所有位置,看看哪个可以走通
4.判断马儿是否完成了骑士周游问题

注意:马儿不同的走法,会得到不同的结果,效率也会有影响

代码实现

public class HorseChessBoard {

    private static int X;  //棋盘的列数
    private static int Y;  //棋盘的行数
    
    //创建数组标记棋盘各个位置是否被访问过
    private static boolean[] visited;
    //使用一个属性标记是否棋盘的所有位置都被访问过,即是否成功
    private static boolean finish;  //如果为true表示成功
    
    public static void main(String[] args) {
        X = 8;
        Y = 8;
        int row = 1;
        int col = 1; 
        int[][] chessboard =  new int[X][Y];
        visited = new boolean[X * Y];
        
        long start = System.currentTimeMillis();
        traversalChessboard(chessboard, row-1, col-1, 1);
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        
        for (int[] rows : chessboard) {
            for (int step : rows) {
                System.out.print(step + "  ");
            }
            System.out.println();
        }
    }
    
    //其实周游问题
    public static void traversalChessboard(int[][] chessboard, int row, int col, int step) {
        
        if (finish) return;
        chessboard[row][col] = step;
        visited[row * X + col] = true;  //标记该位置已经访问
        //获取当前位置可以走的下一个位置的集合
        List<Point> ps = next(new Point(col, row));
        sort(ps);
        
        //遍历ps
        while (!ps.isEmpty()) {
            Point p = ps.remove(0);  //取出下一个可以走的位置
            //判断该点是否已经访问过
            if (!visited[p.y * X + p.x]) {
                traversalChessboard(chessboard, p.y, p.x, step+1);
            }
        }
        
        //1. 棋盘到目前位置任然未走完
        //2. 棋盘处于一个回溯过程
        if (step < X * Y && !finish) {
            chessboard[row][col] = 0;
            visited[row * X + col] = false;
        } else {
            finish = true;
        }
    }
    
    //根据当前这一步的所有的下一步的选择位置进行非递减排序
    public static void sort(List<Point> ps) {
        ps.sort(new Comparator<Point>() {

            @Override
            public int compare(Point o1, Point o2) {
                //获取o1,o2下一步所有个数
                int count1 = next(o1).size();
                int count2 = next(o2).size();
                if (count1 < count2) {
                    return -1;
                } else if (count1 == count2) {
                    return 0;
                } else {
                    return 1;
                }
            }
        });
    }
    
    //Point:根据当前位置(point对象)
    //根据当前位置,计算马儿还能走那些位置,并放到一个集合中(ArrayList),最多8个位置
    public static List<Point> next(Point curPoint) {
        //创建list集合
        List<Point> ps = new ArrayList<>();
        //创建一个point
        Point p1 = new Point();
        if ((p1.x = curPoint.x-2) >= 0 && (p1.y = curPoint.y-1) >= 0) {
            ps.add(new Point(p1));
        }
        
        if ((p1.x = curPoint.x-1) >= 0 && (p1.y = curPoint.y-2) >= 0) {
            ps.add(new Point(p1));
        }
        
        if ((p1.x = curPoint.x+1) < X && (p1.y = curPoint.y-2) >= 0) {
            ps.add(new Point(p1));
        }
        
        if ((p1.x = curPoint.x+2) < X && (p1.y = curPoint.y-1) >= 0) {
            ps.add(new Point(p1));
        }
        
        if ((p1.x = curPoint.x+2) < X && (p1.y = curPoint.y+1) < Y) {
            ps.add(new Point(p1));
        }
        
        if ((p1.x = curPoint.x+1) < X && (p1.y = curPoint.y+2) < Y) {
            ps.add(new Point(p1));
        }
        
        if ((p1.x = curPoint.x-1) >= 0 && (p1.y = curPoint.y+2) < Y) {
            ps.add(new Point(p1));
        }
        
        if ((p1.x = curPoint.x-2) >= 0 && (p1.y = curPoint.y+1) < Y) {
            ps.add(new Point(p1));
        }
        
        return ps;
    }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • springboot2.x引入feign踩的坑及解决

    springboot2.x引入feign踩的坑及解决

    这篇文章主要介绍了springboot2.x引入feign踩的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 使用Spring的StopWatch实现代码性能监控的方法详解

    使用Spring的StopWatch实现代码性能监控的方法详解

    在开发过程中,偶尔还是需要分析代码的执行时间,Spring 框架提供了一个方便的工具类 StopWatch,本文将介绍 StopWatch 的基本用法,并通过示例演示如何在项目中使用 StopWatch 进行代码性能监控
    2023-12-12
  • Hibernate+JDBC实现批量插入、更新及删除的方法详解

    Hibernate+JDBC实现批量插入、更新及删除的方法详解

    这篇文章主要介绍了Hibernate+JDBC实现批量插入、更新及删除的方法,结合实例形式较为详细的分析了Hibernate与JDBC针对数据库的批量操作相关实现技巧,需要的朋友可以参考下
    2017-11-11
  • Spring Data JPA系列QueryByExampleExecutor使用详解

    Spring Data JPA系列QueryByExampleExecutor使用详解

    这篇文章主要为大家介绍了Spring Data JPA系列QueryByExampleExecutor使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详解ConcurrentHashMap如何保证线程安全及底层实现原理

    详解ConcurrentHashMap如何保证线程安全及底层实现原理

    这篇文章主要为大家介绍了ConcurrentHashMap如何保证线程安全及底层实现原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • java操作ftp下载文件示例

    java操作ftp下载文件示例

    这篇文章主要介绍了java操作ftp下载文件的示例,需要的朋友可以参考下
    2014-02-02
  • hashCode方法的使用讲解

    hashCode方法的使用讲解

    有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,我来解释一下吧。
    2013-03-03
  • ArrayList的自动扩充机制实例解析

    ArrayList的自动扩充机制实例解析

    本文主要介绍了ArrayList的自动扩充机制,由一个题目切入主题,逐步向大家展示了ArrayList的相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • Java类的定义以及执行顺序学习教程

    Java类的定义以及执行顺序学习教程

    这篇文章主要介绍了Java类的定义以及执行顺序学习教程,包括对象的创建等面向对象编程的基础知识,需要的朋友可以参考下
    2015-09-09
  • Java实现CSV格式转对象

    Java实现CSV格式转对象

    csv全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,常用来存储数据的纯文本格式文件。本文将用Java语言实现CSV转对象,需要的可以参考一下
    2022-06-06

最新评论