java實現馬踏棋盤的算法
本文實例為大傢分享瞭java實現馬踏棋盤的具體代碼,供大傢參考,具體內容如下
馬踏棋盤算法介紹
8X8棋盤,馬走日字,要求每個方格隻進入一次,走遍棋盤上全部64個方格。
代碼:
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) { System.out.println("騎士周遊算法"); //測試騎士周遊算法是否正確 X = 8; Y = 8; int row = 1;//初始位置的行,從1開始編號 int column = 1;//初始位置的列,從1開始編號 //創建棋盤 int[][] chessboard = new int[X][Y]; visited = new boolean[X*Y];//初始值都是false //測試一下耗時 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)); //對ps進行排序,排序的規則就是對所有的Point對象的下一步的位置的數目進行非遞減排序; sort(ps); //遍歷ps while (!ps.isEmpty()){ Point p = ps.remove(0);//取出下一個可以走的位置 //判斷該點是否已經訪問過 if (!visited[p.y * X + p.x]){//說明還沒有訪問過 traversalChessboard(chessboard, p.y, p.x, step + 1); } } //判斷是否完成任務,使用step和應該走的步數比較 //如果沒有達到數量,則表示沒有完成任務,將整個棋盤置0 //說明:step < X * Y成立:①棋盤到目前為止仍然沒有走完;②棋盤處於一個回溯過程 if (step < X * Y && !finished){ chessboard[row][column] = 0; visited[row * X + column] = false; }else { finished = true; } } /** * 功能:根據當前位置(Point對象),計算馬兒還能走哪些位置(Point),並放入到一個集合中ArrayList,最多有八個位置 * * @param curPoint * @return */ public static ArrayList<Point> next(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; } //根據當前這一步的所有的下一步的選擇位置,進行非遞減排序,減少回溯次數 public static void sort(ArrayList<Point> ps){ ps.sort(new Comparator<Point>() { @Override public int compare(Point o1, Point o2) { //先獲取o1的下一步的所有位置的個數 int count1 = next(o1).size(); //獲取o2的下一步的所有位置的個數 int count2 = next(o2).size(); if (count1 < count2){ return -1; }else if(count1 == count2){ return 0; }else { return 1; } } }); } }
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。