VB高手解决难题最少步数

laoau127 2015-07-14 06:20:13
有一人棋子,其1,6面2,4面3,5面相对,现给出一个M*N的棋盘,棋子起初处于(1,1)点,

摆放状态给定,现在要求用最少的步数从(1,1)点翻滚到(M,N)点,并且1面向上


算法分析 比较容易想到的算法是宽度优先搜索算法。由于搜索树的枝树是3叉,十分容易“超时”,
即使加了剪枝条件效果仍旧不明显。

我们对问题进行分析:对于一个棋子,其总共只有24种状态。在(1,1)点时,其向右翻滚至(2,1)点,
向上翻滚至(1,2)点。而任意(I,J)点的状态是由(I-1,J)和(I,J-1)点状态推导出来的。
那么,如果规定棋子只能向上和向右翻滚,则可以用动态规划的方法将到达(M,N)点的所有可能的
状态推导出来。而如果只能向上和向右翻滚能够到达(M,N)点的话,这种方法一定是最优的。
所以,我们从(1,1)开始进行宽度优先搜索,每扩展出一个节点变做一次动态规划,
直到动态规划找到解,或者宽度优先搜索找到解为止,这样即可以保证最优解。


用简单搜索容易超时,当M,N较大可以用动态规划

对于一个棋子,总共只有24种状态。在(1,1)点时,其向右翻滚至(2,1)点,向上翻滚到(1,2)点.

而任意(I,J)点的状态是由(I-1,J)和(I,J-1)点状态推导出来,所以如果规定棋子只能向上和向右

翻滚,则可以用动态规划的方法将到达(M,N)点的所有可能状态推导出来.显然,从(1,1)到达(M,N)这些

状态的路径最优的。如果这些状态中有1面向上的,则已求出解.如果没有,则可以从(M,N)点开始广度

搜索,以(M,N)点状态组作为初始状态,每扩展一步时,检查当前所得的状态组是否有状态与到达格子的状态组

中状态相同,如果有,则由动态规划的最优性和广度搜索的最优性可以保证求出最优解.
...全文
1968 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-07-16
  • 打赏
  • 举报
回复
算法问题,给了思路代码你自己写啊。
毕竟不是几分钟就能写完的代码,谁这么有空啊。
Tiger_Zhao 2015-07-15
  • 打赏
  • 举报
回复
更正:取 S2 = (M2+1,N2+1,面1)的最少步数
Tiger_Zhao 2015-07-15
  • 打赏
  • 举报
回复
首先,这不叫棋子叫骰子。

1面向上时,向X或Y方向滚4步又恢复成1面向上。
所以先把X、Y方向整4步走掉:S1 = (((M-1)\4) + ((N-1)\4)) * 4
余下的距离
M2=(M-1) Mod 4
N2=(N-1) Mod 4
等价于求 (1,1) 走到 (M2+1,N2+1) 的解。最多是5x5的格子,骰子6个面,5*5*6=120 种状态。
无论用广度还是深度都很容易把到达这个120种状态的最少步数求出来。
只要求出一次,任何的(M,N)按照上面求得(M2,N2),取 S2 = (M2,N2,面1)的最少步数
最终步数就是 S1+S2
laoau127 2015-07-15
  • 打赏
  • 举报
回复
如何写代码,谁会写啊
舉杯邀明月 2015-07-15
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
都有解。 比如就在(1,1)上要翻出其余六一个面: A:右、下、左、上,就把原先的左侧面翻到上面。一共有4个起始方向,所以4个侧面都可以翻到上面。 B:右、下、下、左、上、上,原先的底面翻到了上面。
Tiger_Zhao 2015-07-15
  • 打赏
  • 举报
回复
都有解。
比如就在(1,1)上要翻出其余六一个面:
A:右、下、左、上,就把原先的左侧面翻到上面。一共有4个起始方向,所以4个侧面都可以翻到上面。
B:右、下、下、左、上、上,原先的底面翻到了上面。
舉杯邀明月 2015-07-15
  • 打赏
  • 举报
回复
引用 楼主 laoau127 的回复:
有一人棋子,其1,6面2,4面3,5面相对,现给出一个M*N的棋盘,棋子起初处于(1,1)点, 摆放状态给定,现在要求用最少的步数从(1,1)点翻滚到(M,N)点,并且1面向上 .........
对于任意的M、N,这会不会出现“无解”的情况?

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧