我开始使用以下规则为机会游戏开发算法:
在游戏开始时,玩家从起始案例S(开始)开始。
他首先掷骰子并提前显示的空格数量。
骰子的可能值从1到6。
然后玩家执行当前案例中指示的动作(前进,返回,重新骰子(如果当前案例为R:Relance))。
每次操作都需要1个回合。
当玩家到达结束案例E(结束)时赢得游戏。玩家必须完全落在终点线上并且不能超过它。
开始和结束的情况S和E不一定在托盘的开头和结尾。
转牌出局失去了比赛。
以下是一个例子:
| 4 | S | -2 | 1 | R | 4 | 3 | 4 | 3 | -5 | 2 | -4 | E |
玩家从S案开始。获胜的最快方式是:
掷骰子并制作3,进入R方(转1)。
重新掷骰子并制作6,转到2号方位(转2)。
玩家有义务前进2个案件并到达案件E(第3轮)。
预期结果为3,因为至少需要3次发布才能完成游戏。
我的解决方案基于一个从End案例开始的算法,并检查驱动到End的案例。然后,我将检查哪些案例可以达到我已经找到的案例。这样,我就不必检查那些不会导致最终案例的案例。
问题是,我更倾向于更加重视代码的质量及其有效性,因为我认为我发现的算法还不够。
有什么建议吗?
答案 0 :(得分:1)
您可以将自己的电路板视为有向图。每个案例都是一个节点,编号的案例边缘将它们连接到它们指向的案例,而S和R案例有六个边缘将它们连接到接下来的六个案例。边缘具有相同的重量。
在这种情况下,您的问题就是找到沿最短路径开始和结束节点之间的距离,has been widely studied in many different variants。
作为参考,你可以看一个标准的breadth-first search,你的算法应该与这个算法相当(你可以在找到目的地后立即返回,完整的算法计算从节点到ALL的距离)其他节点)。
我不认为决定是从End案例还是从Start案例中起作用很重要,在这两种情况下你都会有一些分析速度较慢或较快的板子结构,但平均值复杂性应该是一样的。 (正如你所说,从End开始,你要避免检查不会导致它的案例,但是从Start开始你会避免检查无法从它上面找到的案例)