回溯法绝对是如果你想要所有的解决方案的方法。BFS / A* / Dijkstra 等等可能会起作用(需要证明),但无论如何它们很可能不会给你所有的解决方案。在这里使用回溯法不应该花费太长时间,因为可玩区域非常小,而且你有相对较少的棋子和移动次数,这允许使用良好的启发式算法。
为了避免搜索每个可达位置,您需要一种快速确定位置是否无解的方法。您无法快速排除所有无解位置,但可以排除其中许多。一个要检查的事情是对于每个骰子D和每个孔H,是否可能让骰子D到达孔H。即使这也不容易准确地弄清楚。作为保守边界,您可以将所有骰子上剩余数字相加,假设D还有那么多的移动量(因为每个这样的移动都可以理论上推动D),然后看看D是否能够到达H。稍微不那么保守的边界是,您可以将所有多余的移动分配给最接近能够推动D的骰子E,然后看看D(在E的帮助下)是否能够到达H。一旦确定了哪些骰子仍然可能到达哪些孔,如果有一个骰子无法到达任何孔,或者有一个孔无法被任何骰子到达,则该位置无解。同样,如果有N个骰子无法到达N个不同的孔,或者有H个孔无法被N个不同的骰子到达,则该位置无解。这种启发式方法不能完全解决您的问题,但它可以使某些范围的棋盘搜索空间更易于管理。