VB高手解决难题最少步数
有一人棋子,其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)点状态组作为初始状态,每扩展一步时,检查当前所得的状态组是否有状态与到达格子的状态组
中状态相同,如果有,则由动态规划的最优性和广度搜索的最优性可以保证求出最优解.