骑士周游问题
作者:互联网
骑士周游问题实际上是图的深度优先搜索(DFS)的应用,使用回溯的方式来解决步骤过于繁琐,一旦走错就要回溯
为了减少运算次数,使用贪心算法进行优化:根据当前一步的所有的下一步的选择位置进行递减排序 减少回溯次数
import java.awt.*; import java.util.ArrayList; import java.util.Comparator; public class HorseChessboard { private static int X;//列数 private static int Y;//行数 private static boolean visited[];//位置是否被访问 private static boolean finished;//true 成功 public static void main(String[] args) { X = 8; Y = 8; int row = 1; int column = 1; int[][] chessboard = new int[X][Y]; visited = new boolean[X * Y]; long start = System.currentTimeMillis(); traversalChessboard(chessboard, row - 1, column - 1, 1); long end = System.currentTimeMillis(); System.out.println(end - start); for (int[] rows : chessboard) { for (int step : rows) { System.out.print(step + "\t"); } System.out.println(); } } /** * 骑士周游问题算法 * * @param chessboard 棋盘 * @param row 从0开始第几行 * @param column 从0开始第几列 * @param step 第几步 1 */ public static void traversalChessboard(int[][] chessboard, int row, int column, int step) { chessboard[row][column] = step; visited[row * X + column] = true; ArrayList<Point> ps = next(new Point(column, row)); sort(ps); while (!ps.isEmpty()) { Point p = ps.remove(0);//取出下一个可以走的位置 if (!visited[p.y * X + p.x]) { traversalChessboard(chessboard, p.y, p.x, step + 1); } } if (step < X * Y && !finished) { chessboard[row][column] = 0; visited[row * X + column] = false; } else { finished = true; } } public static ArrayList<Point> next(Point curPoint) { ArrayList<Point> ps = new ArrayList<>(); Point p1 = new Point(); //判断可以走的位置 if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y - 1) >= 0) { ps.add(new Point(p1)); } if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y - 2) >= 0) { ps.add(new Point(p1)); } if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y - 2) >= 0) { ps.add(new Point(p1)); } if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y - 1) >= 0) { ps.add(new Point(p1)); } if ((p1.x = curPoint.x + 2) < X && (p1.y = curPoint.y + 1) < Y) { ps.add(new Point(p1)); } if ((p1.x = curPoint.x + 1) < X && (p1.y = curPoint.y + 2) < Y) { ps.add(new Point(p1)); } if ((p1.x = curPoint.x - 1) >= 0 && (p1.y = curPoint.y + 2) < Y) { ps.add(new Point(p1)); } if ((p1.x = curPoint.x - 2) >= 0 && (p1.y = curPoint.y + 1) < Y) { ps.add(new Point(p1)); } return ps; } //根据当前一步的所有的下一步的选择位置进行递减排序 减少回溯次数 public static void sort(ArrayList<Point> ps) { ps.sort(new Comparator<Point>() { @Override public int compare(Point o1, Point o2) { int count1 = next(o1).size(); int count2 = next(o2).size(); if (count1 < count2) { return -1; } else if (count1 == count2) { return 0; } else { return 1; } } }); } }
标签:ps,周游,p1,Point,int,问题,curPoint,new,骑士 来源: https://www.cnblogs.com/bingbug/p/12366077.html