常用的十种算法--马踏棋盘算法

2023-11-19

1.马踏棋盘算法介绍:

        马踏棋盘算法也被称为骑士周游问题

将马随机放在国际象棋的 8×8 棋盘 Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部 64 个方格

2.马踏棋盘算法应用实现

  1. 马踏棋盘问题实际上是图的深度优先搜索(DFS)的应用。
  2. 如果使用回溯(就是深度优先搜索)来解决,假如马儿踏了 53 个点,如图:走到了第 53 个,坐标(1,0),发现已经走到尽头,没办法,那就只能回退了,查看其他的路径,就在棋盘上不停的回溯……

3.代码实现:

package algorithm;

import java.awt.*;
import java.util.ArrayList;

/**
 * @author WuChenGuang
 */
public class HorseChessboard {

    private static int X;

    private static int Y;

    /**
     * 判断是否已经访问过
     */
    private static boolean[] visited;

    /**
     * 表示棋盘中所有的位置是否都被标记了
     */
    private static boolean finished;

    public static void main(String[] args) {
        // 描述棋盘
        X = 8;
        Y = 8;
        int row = 1;
        int column = 1;

        int[][] chessBoard = new int[X][Y];
        visited = new boolean[X * Y];

        long start = System.currentTimeMillis();
        chessboard(chessBoard, row - 1, column - 1, 1);

        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }

    public static void chessboard(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));

        // 预判未来要跳的次数,减少回溯
        sort(ps);

        while (!ps.isEmpty()) {
            Point nextPoint = ps.remove(0);
            if (!visited[nextPoint.y * X + nextPoint.x]) {
                chessboard(chessBoard, nextPoint.y, nextPoint.x, step + 1);
            }
        }

        // 计算当前已经走的次数是否已经走完,完成任务 step<x*y,
        if (step < X * Y && !finished) {
            chessBoard[row][column] = 0;
            visited[row * X + column] = false;
        } else {
            finished = true;
        }
    }

    /**
     * @param curPoint 当前所在的位置
     * @return 下一次跳的位置集合
     */
    public static ArrayList<Point> next(Point curPoint) {
        ArrayList<Point> ps = new ArrayList<>();
        Point point = new Point();

        if ((point.x = curPoint.x - 2) >= 0 && (point.y = curPoint.y - 1) >= 0) {
            ps.add(new Point(point));
        }

        if ((point.x = curPoint.x - 1) >= 0 && (point.y = curPoint.y - 2) >= 0) {
            ps.add(new Point(point));
        }

        if ((point.x = curPoint.x + 1) < X && (point.y = curPoint.y - 2) >= 0) {
            ps.add(new Point(point));
        }

        if ((point.x = curPoint.x + 2) < X && (point.y = curPoint.y - 1) >= 0) {
            ps.add(new Point(point));
        }

        if ((point.x = curPoint.x + 2) < X && (point.y = curPoint.y + 1) < Y) {
            ps.add(new Point(point));
        }

        if ((point.x = curPoint.x + 1) < X && (point.y = curPoint.y + 2) < Y) {
            ps.add(new Point(point));
        }

        if ((point.x = curPoint.x - 1) >= 0 && (point.y = curPoint.y + 2) < Y) {
            ps.add(new Point(point));
        }

        if ((point.x = curPoint.x - 2) >= 0 && (point.y = curPoint.y + 1) < Y) {
            ps.add(new Point(point));
        }
        return ps;
    }

    public static void sort(ArrayList<Point> ps) {
        ps.sort((o1, o2) -> {
            int count1 = next(o1).size();
            int count2 = next(o2).size();

            return Integer.compare(count1, count2);
        });
    }
}

 运行结果:

注:每次结果不一样。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常用的十种算法--马踏棋盘算法 的相关文章

  • CATCTF wife原型链污染

    CATCTF wife原型链污染 原型链污染原理 https drun1baby github io 2022 12 29 JavaScript E5 8E 9F E5 9E 8B E9 93 BE E6 B1 A1 E6 9F 93 如下

随机推荐

  • Java-API简析_java.net.Inet4Address类(基于 Latest JDK)(浅析源码)

    版权声明 未经博主同意 谢绝转载 请尊重原创 博主保留追究权 https blog csdn net m0 69908381 article details 132643590 出自 进步 于辰的博客 因为我发现目前 我对Java API的
  • 西瓜书学习笔记——(1)绪论

    前言 之前由于机器学习 人工智能 数据分析大火 为了顺应时代 于是找了几个国外的视频网站看了点相关的讲解 但由于本人英语水平有限 看起来太吃力 而且当时也没有Python的基础 听得晕头转向的 然后就买了两本书 打算进行系统性的学习 其中一
  • 二级空间配置器、空间配置器的默认选择、再次封装、对象的构造与释放

    内存池 内存池 一块大的内存空间 对空间的管理机制 1 提前准备好一块大的内存块备用 如果用户需要空间的时候 不需要通过malloc每次向系统索要 直接从备用大块内存中来进行获取 2 不会频繁向系统索要小的内存块 解决内存碎片问题 申请空间
  • 计算机系统基础、LinkLab实验每个实验阶段(共5个)考察ELF文件组成与程序链接过程的不同方面知识 阶段1:全局变量ó数据节 阶段2:强符号与弱符号ó数据节 阶段3:代码节修改 阶段4:代码与重定

    LinkLab实验 1 实验目的与要求 1 了解链接的基本概念和链接过程所要完成的任务 2 理解ELF目标代码和目标代码文件的基本概念和基本构成 3 了解ELF可重定位目标文件和可执行目标文件的差别 4 理解符号表中包含的全局符号 外部符号
  • 文字转png图片

    body中的数据格式 Convert text to PNG image param text param options param options font 30px sans serif css style font param op
  • java线程API

    守护线程 守护线程也称为 后台线程 守护线程是通过普通线程调用setDaemon boolean on 方法设置而来的 因此创建上与普通线程无 异 守护线程的结束时机上有一点与普通线程不同 即 进程的结束 进程结束 当一个进程中的所有普通线
  • MCU最强科普总结~

    MCU是Microcontroller Unit 的简称 中文叫微控制器 俗称单片机 是把CPU的频率与规格做适当缩减 并将内存 计数器 USB A D转换 UART PLC DMA等周边接口 甚至LCD驱动电路都整合在单一芯片上 形成芯片
  • 【语义分割】7、OCRNet:Object-Context Representations for Semantic Segmentation

    文章目录 一 文章出发点 二 方法 三 效果 一 文章出发点 每个像素点的类别 label 应该是它所属目标 object 的类别 所以这篇文章对像素的上下文信息建模 建模方法 求每个像素点和每个类别的相关性 二 方法 方法 以 citys
  • LL(1)文法的预测分析表以及对某输入串的分析过程

    举例说明LL 1 文法的预测分析 以及对 a a 的分析过程 文法G S S gt a S gt S gt T T gt SN N gt SN N gt 是否 gt First集 Follow集 S 否 a T 否 a N 是 Select
  • 使用adb工具打开TCL电视的第三方应用安装权限

    使用adb工具打开TCL电视的第三方应用安装权限 前言 安装adb工具 打开电视的adb调试开关 abd工具打开电视权限 前言 新买的TCL电视往往默认是无法安装第三方应用的 即使用U盘安装了第三方应用 应用也没有升级权限 另外 也无法通过
  • Android 经验分享

    搞Android已经两年了 之前一直在eoe上面写文章 竟然没有写一篇CSDN的文章 真的很惭愧 从今天希望自己可以坚持下去 把每天的收获都可以保存起来 同时也分享给大家 希望大家有用 不说废话了 我先写几条我自己工作中的一些经验吧 1 推
  • Python 一年中的第几天

    给你一个字符串 date 按 YYYY MM DD 格式表示一个 现行公元纪年法 日期 返回该日期是当年的第几天 LeetCode 1154 一年中的第几天 class Solution def dayOfYear self date st
  • oracle突然变慢 awr,案例:Oracle awr 数据严重不一致 awr部分表损坏等情况 需要重建awr...

    天萃荷净 Oracle数据库服务器突然断电 导致AWR部分表出现问题 记录重建awr的步骤过程 由于某种原因 比如数据异常断电 导致awr数据严重不一致 awr部分表损坏等情况 需要重建awr 可以参考如下步骤进行重建 本文主要针对目前主流
  • RabbitMQ(四):RabbitMQ高级特性

    消息队列在使用过程中 面临着很多实际问题需要思考 消息可靠性问题 如何确保发送的消息至少被消费 次 延迟消息问题 如何实现消息的延迟投递 消息堆积问题 如何解决数百万消息堆积 无法及时消费的问题 高可用问题 如何避免单点的MQ故障而导致的不
  • MATLAB ARMA时间序列分析引导——理解与应用

    MATLAB ARMA时间序列分析引导 理解与应用 引言 时间序列分析是一种重要的数据分析方法 广泛应用于金融 经济 自然科学等领域 ARMA模型是时间序列分析中常用的模型之一 它可以帮助我们预测未来的数值趋势和特征 以便做出相应的决策 本
  • 百度Apollo7.0轨迹规划模块

    百度Apollo 7 0 轨迹规划模块是一种用于自动驾驶汽车的软件工具 其中包含了一组算法和工具 用于在道路上规划车辆的路线和轨迹 这个模块能够考虑车辆的动态特性 如转弯半径 最大转弯角度和最大加速度等 并能够在实时环境中规划车辆的路线 此
  • 记一次关于uni的公共样式使用遇到的坑

    今天在使用uniapp开发小程序时遇到一个问题 在app vue中引入公共样式 在其他界面中使用 直接运行到小程序模拟器上时 是可以正常使用的 但是如果分包放到小程序上公共样式就会失效 在网上找了半天也没找到问题所在 后边瞎写的的时候偶然解
  • OpenStack rdo一键allinone部署

    目录 1 环境准备 2 配置阿里yum源 3 安装openstack 4 安装packstack软件包 5 执行一键部署命令 6 遇到一些问题 7 登录OpenStack 1 环境准备 CentOS7 最小化安装 设置静态IP 编辑 vi
  • 关于求职及面试的一些小技巧

    关于面试的一些小窍门 内容仅代表我个人观点 欢迎批评指正 之前已经分享过怎么样做一份看起来还算不错的简历了 老司机的分享 写简历的过程中 都有哪些坑 点开即可查看 1 关于面试时机 对相当一部分的部门需求者而言 如果求职者不是绝对的让部门需
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法