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;
}
}
算法-回溯-马踏棋盘
最新推荐文章于 2021-02-10 06:06:19 发布