题目
骑士游历
骑士游历问题是指,在国际象棋的棋盘(8行*8列)上,一个马要遍历棋盘,即走到棋盘上的每一格,并且每隔只到达一次。设码在棋盘的某一位置(x,y)上,按照“走马日”的规则,下一步有8个方向走,如图所示。若给定起始位置(x0,y0),使用站和队列探索出一条马遍历棋盘的路径。
8 1 7 2 马 6 3 5 4
回溯枚举解法
这道题的解法思路和走迷宫类似。
首先是新建一个8个方向移动的结点类:
package lab3.Knight;
/**
* @author AyagiKei
* @url https://github.com/Ayagikei
**/
public class Point {
private int x,y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public Point moveNE(){
if(this.getX()-2 <1 || this.getY()+1 >8)
return null;
return new Point(this.getX()-2,this.getY()+1);
}
public Point moveEN(){
if(this.getX()-1 <1 || this.getY()+2 >8)
return null;
return new Point(this.getX()-1,this.getY()+2);
}
public Point moveES(){
if(this.getX()+1 > 8 || this.getY()+2 >8)
return null;
return new Point(this.getX()+1,this.getY()+2);
}
public Point moveSE(){
if(this.getX()+2 > 8 || this.getY()+1 >8)
return null;
return new Point(this.getX()+2,this.getY()+1);
}
public Point moveSW(){
if(this.getX()+2 > 8 || this.getY()-1 <1)
return null;
return new Point(this.getX()+2,this.getY()-1);
}
public Point moveWS(){
if(this.getX()+1 > 8 || this.getY(