本文共 1687 字,大约阅读时间需要 5 分钟。
马在某个点最多可能有8种走法,用递归和回溯实现。
注:代码中,查找下一个可走坐标是从右下第一个开始的,也就是图中的4。可以通过修改a,b...h的值来改变顺序。
/** * 马踏棋盘算法 * 递归和回溯 * */public class HorseStep { public static int X = 8; public static int Y = 8; public static int returnCount = 0; /** * 棋盘 */ public static int chess[][] = new int[X][Y]; /** * 找到基于(x,y)位置的下一个可走位置 * @param x * @param y * @param count * @return */ public static int nextxy(XY xy,int count){ final int a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7; int x = xy.getX(); int y = xy.getY(); int returnInt = 0; switch (count) { // 从以x,y为轴心的 右下 开始 case a: if( x+2<=X-1 && y+1<=Y-1 && chess[y+1][x+2]==0){ x +=2; y +=1; returnInt = 1; } break; case b: if( x+1<=X-1 && y+2<=Y-1 && chess[y+2][x+1]==0){ x +=1; y +=2; returnInt = 1; } break; case c: if( x-1>=0 && y+2<=Y-1 && chess[y+2][x-1]==0){ x -=1; y +=2; returnInt = 1; } break; case d: if( x-2>=0 && y+1<=Y-1 && chess[y+1][x-2]==0){ x -=2; y +=1; returnInt = 1; } break; case e: if( x-2>=0 && y-1>=0 && chess[y-1][x-2]==0){ x -=2; y -=1; returnInt = 1; } break; case f: if( x-1>=0 && y-2>=0 && chess[y-2][x-1]==0){ x -=1; y -=2; returnInt = 1; } break; case g: if( x+1<=X-1 && y-2>=0 && chess[y-2][x+1]==0){ x +=1; y -=2; returnInt = 1; } break; case h: if( x+2<=X-1 && y-1>=0 && chess[y-1][x+2]==0){ x +=2; y -=1; returnInt = 1; } break; default: break; } if(returnInt == 1){ xy.setX(x); xy.setY(y); return 1; } return 0; } /** * 打印棋盘 */ public static void print(){ for(int i=0;i
结果:
如果从(0,0)开始的话