学习笔记-马踏棋盘算法

马踏棋盘或骑士周游问题

  1. 马踏棋盘算法也被称为骑士周游问题
  2. 将马随机放在国际象棋的 8×8 棋盘 Board[0~7][0~7]的某个方格中,马按走棋规则(马走日字)进行移动。要求每个方格只进入一次,走遍棋盘上全部 64 个方格
    在这里插入图片描述

思路

会使用到深度优先思想和类似迷宫问题的寻路策略问题,和八皇后问题也有相似。

  1. 用一个二维数组建立整张棋盘。用另外一个二维数组保存棋盘的每一个位置是否走过
  2. 马在棋盘上有一个初始位置,将这个位置设为已走过,并将步数设为1.
  3. 获得在这个位置上,马下一步能走的位置集合。
  4. 遍历集合里的所有位置,如果那个位置没走过,下一步(步数+1)就走它(递归)
  5. 设置递归结束的标志.用一个布尔变量标志游戏是否成功。当游戏成功时,步数应该等于棋盘格子数。假如某一次,马走完了所有能走的下一步位置,步数还小于棋盘格子数并且还没成功,说明这个位置不能成功的完成游戏,就把这个位置恢复原样(棋盘设为0,设为未走过),接下来的递归会重新去寻找合适的路。如果步数等于棋盘总格子数,说明游戏成功,把标志的布尔变量设为true,这样在层层返回时就不会再进入上面的条件,递归就会逐渐结束而不会深入下去。

涉及到的方法:
根据此时的位置,判断马接下来能走的位置集合。
x的值代表列而y的值代表行
马是按照日字走的,所有当它在中间时最多有8种位置可以走,一 一判断那个位置是否超过棋盘边界。
每种可能都是if,而不是if-else if,因为要获得所有的可能性,而不是找出一个
假如list时一定要新建一个坐标,不能使用同一个,不然值就会互相影响

/**
     * 根据现在的坐标返回可以走的坐标 x列y行
     *
     * @param current
     * @return
     */
    public static ArrayList<Point> findWay(Point current) {
   
        ArrayList<Point> res = new ArrayList<>();
        //可以走的坐标
        Point p = new Point();
        //5
        if ((p.x = current.x - 2) >= 0 && (p.y = current.y - 1) >= 0) {
   
            res.add(new Point(p));
        }
        //6
        if ((p.x = current.x - 1) >= 0 && (p.y = current.y - 2) >= 0) {
   
            res.add(new Point(p));
        }
        //7
        if ((p.x = current.x + 1) < X && (p.y = current.y - 2) >= 0) {
   
            res.add(new Point(p));
        }
        //0
        if ((p.x = current.x + 2) < X && (p.y = current.y - 1) >= 0) {
   
            res.add(new Point(p));
        }
        //1
        if ((p.x = current.x + 2) < X && (p.y = current.y + 1) < Y) {
   
            res.add(new Point(p));
        }
        //2
        if ((p.x = current.x + 1) < X && (p.y = current.y + 2) 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值