骑士巡游问题 java回溯法或栈实现_马步遍历问题与骑士巡游问题的回溯算法

科技信息SCIENCE & TECHNOLOGY INFORMATION2011 年 第 27 期 马步遍历问题与骑士巡游(knight'stour)问题是指在有 8×8 方格的国际象棋棋盘上进行奇异的骑士“L 型”(L-shaped)移动的问题。 在国际象棋棋盘 8×8 方格上的某个格子上放置一个马,然后这个马只能以马跳的方式前进,要求这个马相继地到达所有的 64 个方格,进入每个方格一次且仅进入一次。 而骑士巡游的要求更高一些,要求这个马最后能够回到起点。 这一问题后来扩展到任意大小的棋盘上。 奇异的骑士“L 型”(L-shaped)移动的问题从十八世纪初以来,一直吸引着数学家和数学爱好者们的兴趣。 一般地说,用如下方法表示一个解:即把数字 0,1,…,63 放入棋盘中的方格来表示到达这些方格的顺序。解决骑士巡游问题更具创意的方法之一是由 J. C. Warnsdorff 在 1823 年提出的。 其规则:骑士总是移向具有最少出口且没有到达过的方格之一。 由于骑士巡游问题实际是带有约束条件的马步遍历问题,因此在用程序求解的时候可以一起求解。 程序算法依然是回溯法,和皇后问题有相似之处。 马步遍历和骑士巡游问题的复杂度较高,求出一个解相对容易,但要求出所有的解是要花一定时间的。 1 回溯算法的实现 1.1 为解决这个问题,我们把棋盘的横坐标定为 i,纵坐标定为 j。 i 和j 的取值范围是从 1 到 SIZE。 当某个骑士占了位置(i,j)时,其在这个位置上可以向 8 个方向以“L 型”移动,它们分别是:方向 1:i+2,j+1;方向 2:i+1,j+2;方向 3:i-1,j+2;方向 4:i-2,j+1;方向 5:i-2,j-1;方向 6:i-1,j-2;方向 7:i+1,j+2;方向 8:i+2,j-1。 1.2 棋盘以二维数组表示, 其下标最大值 8, 将骑士的每一步按 1,2,3 … 64 填入数组相应单元。 其过程如下: ……… for(inti=0;i<8;i++) for(intj=0;j<8;j++) trajKT[i][j]=0; ……… for(inte=0;e<=curPointSub;e++) { trajKT[moveTraj[e].Location.x_pos][moveTraj[e].Location.y_pos]= e+1; } for(i=0;i<8;i++) { for(intj=0;j<8;j++) cout< #include #include #include //----------------其它---------------------- struct Point { int x_pos; int y_pos; }; Point operator+(const Point &lp,const Point &rp) { Point rtnPoint; rtnPoint.x_pos=lp.x_pos+rp.x_pos; rtnPoint.y_pos=lp.y_pos+rp.y_pos; return rtnPoint; } Point operator-(const Point &lp,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值