马踏棋盘问题:将马随机放在国际象棋的8×8棋盘chese[0~7][0~7]的某个方格中,马按走棋规则进行移动。要求每个方格只进入一次,走遍棋盘上全部64个方格。编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。
将棋盘长和宽定义为常量,方便测试时修改:
private final int X=8;
private final int Y=8;
先定义一个Point类,为马在棋盘中的坐标
class Point{
int x;
int y;
public Point(int x,int y){
this.x=x;
this.y=y;
}
}
找到下一点的代码为:
private Point getNext(Point p,int count){
int x=p.x;
int y=p.y;
Point point;
switch(count){
case 0:
if(x+2
=0 && chese[x+2][y-1]==0){
x=x+2;
y=y-1;
point=new Point(x,y);
return point;
}
break;
case 1:
if(x+2
= 0 && y+2
=0 && y+1
=0 && y-1 >=0 && chese[x-2][y-1]==0){
x=x-2;
y=y-1;
point=new Point(x,y);
return point;
}
break;
case 6:
if(x-1 >=0 && y-2 >=0 && chese[x-1][y-2]==0){
x=x-1;
y=y-2;
point=new Point(x,y);
return point;
}
break;
case 7:
if(x+1
=0 && chese[x+1][y-2]==0){ x=x+1; y=y-2; point=new Point(x,y); return point; } break; default: break; } return null; } }
每次寻找下一点时,都是从1处开始,如果1处符合条件,把1处标记为遍历过,把1点处当作当前点,再寻找它的下一点。我们每次寻找下一点从1点处开始,如果1处不符合条件,即已经遍历过,或者越出棋盘边界,则检查2处是否合格,如果八个点都没有出路,则回溯到上一点处。
遍历的代码为
private int travelChessBoard(Point start,int tag){
int count=0;
int x=start.x;
int y=start.y;
Point next;
chese[x][y]=tag;
if(tag == X*Y){
print();
return 1;
}
//找到下一个点next
next=getNext(start,count);
while(next == null && count <= 7){
count++;
next=getNext(start,count);
}
while(next != null){
if(travelChessBoard(next, tag+1)==1){
return 1;
}
count++;
next=getNext(start,count);
while(next == null && count <= 7){
count++;
next=getNext(start,count);
}
}
if(next == null){
chese[x][y]=0;
}
return 0;
}