算法-回溯-马踏棋盘

package datastructure.horse;

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

public class HorseTraver {
    private static int X;
    private static int Y;
    private static boolean[] visited;//与棋盘对应的位置为true就是访问过,false就是没有访问
    private static boolean finished;
    public static void main(String[] args) {
        X = 6;//X代表列
        Y = 6;//Y代表行
        int row = 1;
        int col = 5;
        int[][] chessboard = new int[Y][X];
        visited = new boolean[X * Y];
        findOk(chessboard, row - 1, col - 1, 1);
        for(int[] r : chessboard) {
            for(int step: r) {
                System.out.print(step+"\t");
            }
            System.out.println();
        }


    }

    /**
     *
     * @param chessboard  棋盘
     * @param row  马当前的行  0开始
     * @param col  马当前的列  0开始
     * @param step  当前是第几步从1开始
     */
    public static void findOk(int[][] chessboard, int row, int col, int step) {
        //先假设该点可以访问,之后的所有步都可以访问成功
        chessboard[row][col] = step;
        visited[row * X + col] = true;
        ArrayList<Point> next = next(new Point(col, row));
        while (!next.isEmpty()) {
            Point point = next.remove(0);
            //判断该点是否访问过了,没有访问过就递归
            if(!visited[point.y * X + point.x]) {
                findOk(chessboard, point.y, point.x, step+1);
            }


        }
        //当跳出while时表示没有下一个点可以走了
        //可能没走完,可能走完了
        if(step < X * Y && !finished) {
            chessboard[row][col] = 0; //表示当前位置之后的所有走法走不通
            //所以该点就访问不成功
            visited[X * row + col] = false;
        }else {
            finished = true;
        }
    }



	//给我当前的点,我把下一步能下的点装进集合中
    public static ArrayList<Point> next(Point curPoint) {
        ArrayList<Point> list = new ArrayList<>();
        Point p1 = new Point();

        //0
        if((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y - 1) >= 0) {
            list.add(new Point(p1));
        }
        //1
        if((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y + 1) < Y) {
            list.add(new Point(p1));
        }
        //2
        if((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y + 2) < Y) {
            list.add(new Point(p1));
        }

        //3
        if((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y + 2) < Y) {
            list.add(new Point(p1));
        }
        //4
        if((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y + 1) < Y) {
            list.add(new Point(p1));
        }
        //5
        if((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y - 1) >= 0) {
            list.add(new Point(p1));
        }
        //6
        if((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y - 2) >= 0) {
            list.add(new Point(p1));
        }
        //7
        if((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y - 2) >= 0) {
            list.add(new Point(p1));
        }
        return list;
    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值