美文网首页
骑士周游回溯算法

骑士周游回溯算法

作者: 墨宇暗黑 | 来源:发表于2022-02-20 15:52 被阅读0次

其实周游就是说马在一个棋盘上以走斜日的方式走棋盘,不能走已经走过的,需要将这个棋盘走完,最后一步回归原点,不过我的这个没有回归原点,如果需要回归我的这个算法也只需要判断以下即可

1.判断当前是否已经到达终点
2.如果不是,列举出当前马可以走的八个方位
3.尝试第一个方位
4.如果第一个方位可以走,就回到第一步,进入下一个循环
5.如果不可以便回到2尝试下一步,知道尝试完八个方位
public class HorseChessBoardTest {
    public static void main(String[] args) {
        HorseChessBoard horseChessBoard = new HorseChessBoard(8);
        horseChessBoard.showChessBoard();
        System.out.println();
        System.out.println(horseChessBoard.goChessBoard(2,4));
        horseChessBoard.showChessBoard();


    }
}
class HorseChessBoard{
    private int count; //需要走的总步数
    private int step; //当前已经走的步数,根据这个和总部书判断是否已经完成所有步数
    private int row; //行数
    private int col; //列数,与行数相等,只是为了好分辨
    private int[][] chess; //棋盘,0代表未走的,数字代表是走的第几步
    //马站在一个位置可以踏的方向有八个,只需要用马的走遍和里面的每一个小数组相加即可,便于遍历
    private int[][] direction = {{-2,-1},{-1,-2},{-2,1},{-1,2},{1,2},{2,1},{1,-2},{2,-1}}; 

    //初始化工作
    public HorseChessBoard(int chess) {
        this.chess = new int[chess][chess];
        col = row = chess;
        count = chess*chess;
        step = 1;
    }
    public boolean goChessBoard(int x,int y){
        if(step == count && chess[x][y] == 0){//判断是否为最后一步,并且当前这一步是否合法,如果条件成立,代表走完
            chess[x][y] = step;
            return true;
        }
        boolean flag = false;
        for (int[] ints : direction) {//循环遍历八个方向
            //判断当前位置是否合法,以及下一步是否合法
            if(x > -1  && x < col && y > -1 && y < row && x + ints[0] > -1  && x + ints[0] < col && y + ints[1] > -1 && y + ints[1] < row && chess[x][y] == 0){
                chess[x][y] = step;
                step++;
                flag = goChessBoard(x + ints[0],y + ints[1]);//递归调用走下一步,并且返回结果
                if(!flag){//如果上一步不能走通进行回溯
                    chess[x][y] = 0;
                    step--;
                }else { //否则返回真
                    return true;
                }
            }
        }

        return flag;
    }
    public void showChessBoard(){ //显示棋盘
        for (int[] ints : chess) {
            for (int anInt : ints) {
                System.out.print( anInt+ "\t");
            }
            System.out.println();
        }
    }
}

相关文章

  • 骑士周游回溯算法

    其实周游就是说马在一个棋盘上以走斜日的方式走棋盘,不能走已经走过的,需要将这个棋盘走完,最后一步回归原点,不过我的...

  • 回溯算法

    回溯算法 回溯算法介绍   回溯算法并不是非常复杂的算法, 很多人接触过但是未必知道这是回溯算法; 典型的回溯算法...

  • 回溯算法:八皇后问题和0-1背包问题

    文章结构 如何理解回溯算法 回溯算法的经典应用 完整源码 图片来源 1. 如何理解回溯算法 1.1 什么是回溯算法...

  • Algorithm进阶计划 -- 回溯算法

    滑动窗口算法回溯算法框架回溯算法运用 1. 回溯算法框架 回溯算法,是类似枚举的搜索尝试过程,主要是在搜索尝试过程...

  • 回溯算法总结

    回溯法学习总结 回溯算法也是算法导论中常用的算法,回溯算法类似于暴力求解算法,经常用在求可能解的问题。下面我将从三...

  • 77. Combinations.go

    回溯算法

  • 递归2-回溯与递归

    I. 回溯算法基础 回溯与递归的区别和联系  很多人不理解回溯与递归到底是什么关系。其实很简单,回溯算法是一种算法...

  • 回溯算法之-组合总和

    回溯算法模版 首先上一套回溯算法模版,很多回溯算法都可以使用该模版解决 leetcode 39 组合总和 给定一个...

  • 17. Letter Combinations of a Pho

    使用回溯算法

  • 「回溯算法」专题介绍

    「回溯算法」专题介绍 第 1 节:从全排列问题开始理解回溯搜索算法 引言 大家好,今天要和大家分享的主题是“回溯算...

网友评论

      本文标题:骑士周游回溯算法

      本文链接:https://www.haomeiwen.com/subject/lnhvlrtx.html