骑士周游算法(跳马)

9 篇文章 0 订阅
6 篇文章 0 订阅
骑士周游算法:主要就是两个思想深度遍历和回溯,以当前点为目标,算出下一个能走的点的集合,然后以下一个能走的目标,然后算出下下个能走的目标,最后不能走时,看有没有完成,没有完成就回退,这里需要一个辅助数组来进行判断点是否有没有走。
接下来就是算法了
//标记点位是否走过
private boolean[] flag;
//多少行,这里设置成8行8列
private int Y = 8;
private int X = 8;
//标记算法是否完成
private boolean isComplete = false;

//param1: 棋盘第一次默认都是0
//param2: 第一步的横坐标
//param3: 第一步的纵坐标
//param4: 当前的步数
public void traversalChessboard(int[][] chessboard, int row, int column, int step) {
	//更新棋盘上的步数
	chessboard[row][column] = step;
	//更新当前点被访问: 当前行 * 列数 + 当前列
	flag[row * X + column] = ture;
	//获取下一步可以走的点
	ArrayList<Point> list = getNext(new Point(row, column));
	//依次遍历所有可以走的点
	while(!list.isEmpty()) {
		int point = list.remove(0);
		//如果这个点没有访问,我们就以这个点为目标递归
		if(!flag[point.y * X + point.x]) {
			traversalChessboard(chessboard, point.y, point.x, step + 1);
		}
	}
	//如果到底了还没有走通,我们就需要回退了
	if() {
		//棋盘位置置为零
		chessboard[row][column] = 0;
		//点位设置未访问
		flag[row * X + column] = false;
	}else{
		//算法完成
		isComplete = true;
	}
}
//获取以当前点,下一个可以走的点,这里主要注意临界条件的判断
public ArrayList<Point> getNext(Point curPoint) {
		//创建一个ArrayList
        ArrayList<Point> ps = new ArrayList<Point>();
        //创建一个Point
        Point p1 = new Point();
        //表示马儿可以走5这个位置
        if((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y -1) >= 0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走6这个位置
        if((p1.x = curPoint.x - 1) >=0 && (p1.y=curPoint.y-2)>=0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走7这个位置
        if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y - 2) >= 0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走0这个位置
        if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y - 1) >= 0) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走1这个位置
        if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y + 1) < Y) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走2这个位置
        if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y + 2) < Y) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走3这个位置
        if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y + 2) < Y) {
            ps.add(new Point(p1));
        }
        //判断马儿可以走4这个位置
        if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y + 1) < Y) {
            ps.add(new Point(p1));
        }
        return ps;
}
骑士周游算法到这就算完成了,这里还可以有优化的点,就是我们使用贪心算法,我们每次走下个点能到最少的点,就是我们把以当前点为目标计算它下个可以走的点的集合,然后把集合中的这些点的能走的点的多少进行一个排序,然后选择一个最少的点走,这里我就懒得写了,大家可以自行实现出来。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值