网上搜索了一下,有好多人现成的产品,不少国产的。编写这个程序只是为了回忆一下算法。不能丢了。
自动求解有俩种方案:一个是求最小行走步骤,一个是求最小推箱子数目。
第一种算法简单些,只要将小人推动的四个方向进行广度优先搜索,通过各种砍掉各种不对的情况来减少搜索数量,但搜索的数量仍然非常巨大。
以下情况可砍掉:
1、前方是墙;
2、前方是箱子,但箱子的前方是墙或者箱子;
3、行动方向和上一步骤的方向是反方向,且上一步没有推箱子;
4、如果小人移动造成推动箱子,那么检查移动后形成的棋盘:
4.1 、以 被推动的棋子 为中心,有没有出现以下死棋。
■■□ □■■ □□□ □□□
■◆□ □◆■ ■◆□ □◆■
□□□ □□□ ■■□ □■■
■ 表示这个位置可能是墙或者箱子;
◆ 表示“被推动的棋子”在推动后所在的位置;
□ 仅为方便理解图片,无任何其他意义。
如果出现上面的情况,就是死棋。
4.2、比较移动后的步骤和之前的步骤是否出项相同的棋局。
注:这里所指“前方”是指行走方向的前方。
第二种方案是求最小推箱数,这个算法上复杂一些,
以小人为起点,做“油漆桶”处理,什么叫“油漆桶”处理呢,看看画笔软件中使用“油漆桶”功能,他可以渗透所有空白的地方。通过此功能,找到所有可以“接触”到的箱子,对所有这些箱子推动,广度优先算法形成搜索树。然后和第一种方案基本相似的方式砍掉多余的树枝。
这个方案我还没有实施,所以还没有想的很具体,先实现第一个在说。
希望有兴趣的朋友可以给意见,告诉我还有那些死棋可以判断。