Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112834
  • 博文数量: 106
  • 博客积分: 2025
  • 博客等级: 大尉
  • 技术积分: 1165
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-06 12:51
文章分类

全部博文(106)

文章存档

2012年(106)

我的朋友

分类: C/C++

2012-05-08 17:20:46

骑士游历问题

骑士游历问题

求解骑士游历问题
显然求解骑士游历问题的每一步就是马在棋盘上走的一步。在每一步马需要选择一个方向进行游历,这时记住解的每一步需要记住两件事:
1.
当前步的行列位置
2.
当前步已经试探过哪些方向了,以便回溯回来时能够选择一个新的方向进行试探


所以使用两个数组,数组board记住棋盘的每个位置是在马的第几步到达的,这反映了问题的解,即第几步到哪个位置。数组direction记住在棋盘的
某个位置已经试探过的方向,每个位置有八个方向,可按某种顺序对八个方向编号,然后在每个位置按编号顺序试探方向。
在确定数据结构之后,同样需要确定下面几个问题:
1.
怎样的状态是初始状态。
2.
怎样选择当前步可能的路线
3.
怎样表示向前推进一步
4.
怎样回溯及清除当前步的痕迹
显然初始状态是棋盘的每个位置都置为第0步到达(即还没有到达),每个位置都还没有选择任何方向(可赋值MAX_DIR(=8)表示没有选择方向)。


选择当前步可能的路线就是在当前位置选择一个方向来游历下一步。在选择的时候同样需要区分是从第0个方向开始考虑还是从上一次的下一个方向开始考虑。为了
方便从下一个方向开始考虑,实际上数组direction在某一位置(curr_x,
curr_y)
的值记住的是从上一位置选择了哪个编号的方向而到达的,这样容易回溯到上一位置,而且容易在回溯到上一位置之后从下个一方向重新试探。

向前推进一步则要根据所选择的方向推进到下一位置,记住到下一位置所选择的方向,下一位置是第几步到达的,然后增加步数。
回溯一步则要标记当前位置没有到达过(将到达的步数置为0),根据上一步到当前位置的所选择的方向(这个方向是记录当前位置所对应的direction数组中)而回溯到上一位置,然后减少步数。

 

阅读(503) | 评论(0) | 转发(0) |
0

上一篇:24点问题

下一篇:一些小问题

给主人留下些什么吧!~~