馬踏棋盤屬於算法裏的經典問題,這裏用遞歸的方式給出一種解法:
java
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); } } }