马踏棋盘算法详解(代码片段)

mx_info mx_info     2022-11-30     387

关键词:

马踏棋盘算法详解

说明

  1. 马踏棋盘是指在一个8 * 8的国际棋盘上,从某一位置开始,每次走一个日字,将所有的位置都走一遍
  2. 可以使用递归 + 回溯来解决,再加上贪心算法来优化
  3. 指定某种策略,因为从棋盘的某一位置开始走,它的下一步最多有8个选择,编写一个方法,将下一步能走的位置记录在集合中
  4. 创建一个Boolean数组记录当前位置是否走过,如果没有走过则可以走,否则不能
  5. 从开始的位置开始,遍历它的下一步可以走的位置的集合,如果当前位置没有走过,则从当前位置又重新开始走,开始判断下一次可以走的位置,如果走不通则回溯
  6. 直到所有的位置都访问过,并且走完相应的步数
  7. 在从集合中选择下一步时,优先选择下一步的下一步可选择的位置较少的位置,体现贪心的思想
  8. 源码见下

源码及分析

package algorithm.algorithm.horse;

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

/**
 * @author AIMX_INFO
 * @version 1.0
 */
@SuppressWarnings("all")
public class HorseChessBoard 
    //棋盘的列
    public static int X;
    //棋盘的行
    public static int Y;
    //判断当前位置是否走过
    public static boolean[] visited;
    //判断是否完成
    public static boolean finished;

    public static void main(String[] args) 
        X = 8;
        Y = 8;
        int row = 2;
        int col = 4;
        visited = new boolean[X * Y];
        int[][] chessboard = new int[X][Y];

        traversalChessBoard(chessboard, row - 1, col - 1, 1);
        show(chessboard);
    

    //显示棋盘
    public static void show(int[][] chessboard)
        for (int[] rol : chessboard) 
            for (int step : rol) 
                System.out.print(step + "\\t");
            
            System.out.println();
        
    

    /**
     * @param chess 棋盘
     * @param row   从棋盘的哪一行开始
     * @param col   那一列
     * @param step  表示走的第几步
     */
    public static void traversalChessBoard(int[][] chess, int row, int col, int step) 
        //设置当前位置是第几步
        chess[row][col] = step;
        //设置当前位置为已经走过
        visited[row * X + col] = true;
        //取出当前位置可以走的下一步的集合
        ArrayList<Point> ps = next(new Point(col, row));
        //使用贪心算法思想,优先走下一步选择较少的位置
        ps.sort(new Comparator<Point>() 
            @Override
            public int compare(Point o1, Point o2) 
                return next(o1).size() - next(o2).size();
            
        );
        //然后遍历下一步所有可以走的点
        while (!ps.isEmpty()) 
            Point p = ps.remove(0);
            if (!visited[p.y * X + p.x]) 
                traversalChessBoard(chess, p.y, p.x, step + 1);
            
        
        //当当前位置的下一个位置走不通时,判断是否走完,如果没有走完,将当前位置置为未走过
        if (step < X * Y && !finished) 
            chess[row][col] = 0;
            visited[row * X + col] = false;
         else 
            finished = true;
        

    

    /**
     * \\
     *
     * @param cur 当前位置点的坐标
     * @return 返回从当前位置可以走的下一个位置的所有点的集合
     */
    public static ArrayList<Point> next(Point cur) 
        //创建集合保存可以走的点
        ArrayList<Point> ps = new ArrayList<>();
        //创建一个点
        Point p = new Point();
        if ((p.x = cur.x - 2) >= 0 && (p.y = cur.y - 1) >= 0) 
            ps.add(new Point(p));
        
        if ((p.x = cur.x - 1) >= 0 && (p.y = cur.y - 2) >= 0) 
            ps.add(new Point(p));
        
        if ((p.x = cur.x + 2) < X && (p.y = cur.y - 1) >= 0) 
            ps.add(new Point(p));
        
        if ((p.x = cur.x + 1) < X && (p.y = cur.y - 2) >= 0) 
            ps.add(new Point(p));
        
        if ((p.x = cur.x + 2) < X && (p.y = cur.y + 1) < Y) 
            ps.add(new Point(p));
        
        if ((p.x = cur.x + 1) < X && (p.y = cur.y + 2) < Y) 
            ps.add(new Point(p));
        
        if ((p.x = cur.x - 2) >= 0 && (p.y = cur.y + 1) < Y) 
            ps.add(new Point(p));
        
        if ((p.x = cur.x - 1) >= 0 && (p.y = cur.y + 2) < Y) 
            ps.add(new Point(p));
        
        return ps;
    


day600&601.马踏棋盘算法-数据结构和算法java(代码片段)

马踏棋盘算法图的深度优先DFS回溯八皇后问题、小老鼠找迷宫问题一、介绍二、思路分析三、代码实现packagecom.achang.algorithm;importjava.awt.*;importjava.util.ArrayList;importjava.util.Arrays;/***马踏棋盘问题&骑士周游问题*/classHorseChessBoardpubl... 查看详情

数据结构(图的遍历和马踏棋盘算法)(代码片段)

图的遍历  有两种方法:深度优先,广度优先 深度优先遍历约定左手原则,在没有遇到重复顶点的情况下,分叉路口是从向右手边走,每走过一个顶点就做一个记号如果分叉路所通向的结点已经全部走过,则返回上一个结... 查看详情

小甲鱼数据结构和算法--马踏棋盘(骑士周游问题)

代码如下:#include<stdio.h>#include<time.h>#defineX5#defineY5intchess[X][Y];voidprintChess(){inti,j;printf("ThisishorseChess: ");for(i=0;i<X;i++){for(j=0;j<Y;j++){printf("%2d ",chess[i] 查看详情

第28章算法优化体验课-骑士周游问题

韩顺平_循序渐进学Java零基础_第28章算法优化体验课-骑士周游问题(P905-P910)第28章算法优化体验课-骑士周游问题905.马踏棋盘介绍906.马踏棋盘实现1907.马踏棋盘实现2908.马踏棋盘实现3909.马踏棋盘优化910.第三阶段结束语 查看详情

[c语言][数据结构]马踏棋盘问题(代码片段)

将马放入国际象棋8×8棋盘的制定的某个方格中,马按走棋规则进行移动,要求每个方格只进入一次,走遍棋盘上全部64个方格。求出马的行走路线,并按求出的行走路线将数字1,2,…,64依次填入一个... 查看详情

程序员必会十大算法之骑士周游问题(代码片段)

骑士周游问题又叫马踏棋盘问题1.未优化前(没有策略)publicclassMain//定义棋盘的行数和列数staticintX=8;staticintY=8;//定义棋盘上的某个点是否被访问过staticboolean[]isVisited;//记录是否周游结束staticbooleanisFinished=false;pub... 查看详情

数据结构与算法(java版)|几个经典的算法面试题(下)(代码片段)

...家介绍两个经典算法面试题,它们就是八皇后问题和马踏棋盘算法,注意,马踏棋盘算法也被称为骑士周游问题哟!接下来,我就先来给大家介绍一下八皇后问题这个经典算法面试题吧!八皇后 查看详情

骑士游历问题(马踏棋盘)解析(c++)

骑士游历问题:在国际棋盘上使一个骑士遍历所有的格子一遍且仅一遍,对于任意给定的顶点,输出一条符合上述要求的路径解题思路:这是一道经典的遍历问题(DFS),由于题目要求遍历全部,那么肯定要做标记,因此立马想... 查看详情

算法马踏棋盘算法骑士走周游算法

文章目录1.概述2.贪心优化1.概述马踏棋盘算法和八皇后问题很相似:【算法】八皇后问题骑士周游问题的解决步骤和思路创建棋盘chessBoard,是一个二维数组将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位... 查看详情

c++经典算法问题:棋盘覆盖问题(分治算法)!含源码示例(代码片段)

棋盘覆盖问题问题说明在一个2^k*2^k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格。棋盘覆盖问题就是要用图示的4种不同形态的L型骨牌覆盖给定棋盘上除特殊方格之外的所有方格,且任... 查看详情

经典算法之棋盘覆盖问题--分治法(代码片段)

一:算法分析棋盘覆盖问题要求在2^k*2^k个方格组成的棋盘中,你给定任意一个特殊点,用一种方案实现对除该特殊点的棋盘实现全覆盖。建立模型如图:解决方案就是利用分治法,将方形棋盘分成4部分,... 查看详情

c语言游戏超详解扫雷游戏完整版,细节满满!!(代码片段)

...现代码基本思路分步代码实现创建和打印游戏菜单初始化棋盘打印棋盘布置雷排查雷游戏主体——game()函数总代码实现game.htest.cgame.c总结扫雷实现扫雷的算法有很多种,我在这里给大家最详细的代码介绍以及思考... 查看详情

递推问题之马踏过河卒问题

problem     棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦... 查看详情

算法复习_分治算法之二分搜索棋盘覆盖快速排序(代码片段)

  一、基本概念  分治法,顾名思义,即分而治之的算法,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……  二、基本思想及策略  设计思想:将一个... 查看详情

数据结构与算法(java版)|几个经典的算法面试题(下)(代码片段)

...家介绍两个经典算法面试题,它们就是八皇后问题和马踏棋盘算法,注意,马踏棋盘算法也被称为骑士周游问题哟!接下来,我就先来给大家介绍一下八皇后问题这个经典算法面试题吧!八皇后问题八皇后... 查看详情

leetcode打卡——骑士在棋盘上的概率(代码片段)

...从中以等概率随机选择一种。部分走法可能会让骑士离开棋盘,另外的走法则会让骑士移动到棋盘的其他位置,并且剩余的移动次数会减少1。定义dp[step][i][j]dp[step][i][j]dp[step][i][j]表示其实从棋盘商店的点(i,j)(i,j)(i,j)出发&... 查看详情

算法剑指offer47.礼物的最大价值(代码片段)

1.概述在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价... 查看详情

蓝桥杯,算法提高,8皇后·改(代码片段)

  题目如下:问题描述  规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。输入格式  一个8*8的棋盘。输出格式  所能得到的最大数字和样例输入12345678910111213141516171819202122232425262728... 查看详情