java數據結構與算法之馬踏棋盤

本文實例為大傢分享瞭java數據結構與算法之馬踏棋盤的具體代碼,供大傢參考,具體內容如下

  • 馬踏棋盤算法也被稱為騎士周遊問題
  • 將馬隨機放在過期象棋的8×8棋盤的某個方格中,馬按走棋規則進行移動,要求每個方格隻進入一次,走遍棋盤上全部64個方格

騎士周遊問題結局步驟和思路

1.創建棋盤chessBoard,是一個二維數組
2.將當前位置設置為已個訪問,然後根據當前位置,計算馬兒還能走那些位置,並放到一個集合中(ArrayList),最多8個位置
3.變量ArrayList存放的所有位置,看看哪個可以走通
4.判斷馬兒是否完成瞭騎士周遊問題

註意:馬兒不同的走法,會得到不同的結果,效率也會有影響

代碼實現

public class HorseChessBoard {

    private static int X;  //棋盤的列數
    private static int Y;  //棋盤的行數
    
    //創建數組標記棋盤各個位置是否被訪問過
    private static boolean[] visited;
    //使用一個屬性標記是否棋盤的所有位置都被訪問過,即是否成功
    private static boolean finish;  //如果為true表示成功
    
    public static void main(String[] args) {
        X = 8;
        Y = 8;
        int row = 1;
        int col = 1; 
        int[][] chessboard =  new int[X][Y];
        visited = new boolean[X * Y];
        
        long start = System.currentTimeMillis();
        traversalChessboard(chessboard, row-1, col-1, 1);
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        
        for (int[] rows : chessboard) {
            for (int step : rows) {
                System.out.print(step + "  ");
            }
            System.out.println();
        }
    }
    
    //其實周遊問題
    public static void traversalChessboard(int[][] chessboard, int row, int col, int step) {
        
        if (finish) return;
        chessboard[row][col] = step;
        visited[row * X + col] = true;  //標記該位置已經訪問
        //獲取當前位置可以走的下一個位置的集合
        List<Point> ps = next(new Point(col, row));
        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);
            }
        }
        
        //1. 棋盤到目前位置任然未走完
        //2. 棋盤處於一個回溯過程
        if (step < X * Y && !finish) {
            chessboard[row][col] = 0;
            visited[row * X + col] = false;
        } else {
            finish = true;
        }
    }
    
    //根據當前這一步的所有的下一步的選擇位置進行非遞減排序
    public static void sort(List<Point> ps) {
        ps.sort(new Comparator<Point>() {

            @Override
            public int compare(Point o1, Point o2) {
                //獲取o1,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;
                }
            }
        });
    }
    
    //Point:根據當前位置(point對象)
    //根據當前位置,計算馬兒還能走那些位置,並放到一個集合中(ArrayList),最多8個位置
    public static List<Point> next(Point curPoint) {
        //創建list集合
        List<Point> ps = new ArrayList<>();
        //創建一個point
        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;
    }

}

以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: