馬踏棋盤

    馬踏棋盤屬於算法裏的經典問題,這裏用遞歸的方式給出一種解法:

package test;

/**
 * Created by saishangmingzhu on 2018/11/25.
 */
public class Mataqipan {
    /**
     * 馬踏棋盤問題:
     將馬放入8×8棋盤中指定的某方格,馬按規則進行移動。
     要求每個方格只進入一次,走遍棋盤上全部64個方格。求出馬的行走路線,並按求出的行走路線將數字
     1,2,…,64依次填入一個8×8的方陣並輸出。
     */
    //【1】定義×××8*8,左下角爲(0,0)
    //【2】定義馬,佔一格,可以向八個方向運動(1,1)->(3,2)/(2,3)
    // 即(+2,+1)/(+1,+2)/(-1,+2)/(-2,+1)/(-2,-1)/(-1,-2)/(+1,-2)/(+2,-1)
    // 遞歸
    //【3】定義點,點就是二維數組
    private int[][] newPointList=new int[8][8];

    public static void main(String[] arg){
        Mataqipan m=new Mataqipan();
        m.move(0,0,1);
    }

    public void move(int x,int y,int level){
        if (level==64){
            for (int i=7;i>=0;i--){
                for (int j=0;j<=7;j++){
                    if (newPointList[i][j]<10) {
                        System.out.print("0"+newPointList[i][j] + ",");
                    } else {
                        System.out.print(newPointList[i][j] + ",");
                    }
                }
                System.out.println();
            }
            System.out.println("over");
            System.exit(0);
        }
        int x1=0;
        int y1=0;

        x1=x+2;
        y1=y+1;
        //遍歷八個方向的點
        again(level, x1, y1);
        x1=x+1;
        y1=y+2;
        again(level, x1, y1);
        x1=x-1;
        y1=y+2;
        again(level, x1, y1);
        x1=x-2;
        y1=y+1;
        again(level, x1, y1);
        x1=x-2;
        y1=y-1;
        again(level, x1, y1);
        x1=x-1;
        y1=y-2;
        again(level, x1, y1);
        x1=x+1;
        y1=y-2;
        again(level, x1, y1);
        x1=x+2;
        y1=y-1;
        again(level, x1, y1);
        newPointList[x][y]=0;

    }

    private void again(int level, int x1, int y1) {
        //判斷點是否超出範圍,是否已被踩過
        //重複move
        if (x1>=0&&x1<8&&y1>=0&&y1<8&&newPointList[x1][y1]==0){
            newPointList[x1][y1]=level;
            move(x1,y1,level+1);
        }
    }

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章