zoukankan      html  css  js  c++  java
  • 正在编写推箱子游戏的自动求解程序

    网上搜索了一下,有好多人现成的产品,不少国产的。编写这个程序只是为了回忆一下算法。不能丢了。
    自动求解有俩种方案:一个是求最小行走步骤,一个是求最小推箱子数目。
    第一种算法简单些,只要将小人推动的四个方向进行广度优先搜索,通过各种砍掉各种不对的情况来减少搜索数量,但搜索的数量仍然非常巨大。
    以下情况可砍掉:
    1、前方是墙;
    2、前方是箱子,但箱子的前方是墙或者箱子;
    3、行动方向和上一步骤的方向是反方向,且上一步没有推箱子;
    4、如果小人移动造成推动箱子,那么检查移动后形成的棋盘:
        4.1 、以 被推动的棋子 为中心,有没有出现以下死棋。
    ■■□   □■■    □□□   □□□
    □   □■    ■□   □
    □□□   □□□    ■■□   □■■

    ■ 表示这个位置可能是墙或者箱子;
    表示“被推动的棋子”在推动后所在的位置;
    □ 仅为方便理解图片,无任何其他意义。 

                  如果出现上面的情况,就是死棋。
         4.2、比较移动后的步骤和之前的步骤是否出项相同的棋局。

    注:这里所指“前方”是指行走方向的前方。

    第二种方案是求最小推箱数,这个算法上复杂一些,
    以小人为起点,做“油漆桶”处理,什么叫“油漆桶”处理呢,看看画笔软件中使用“油漆桶”功能,他可以渗透所有空白的地方。通过此功能,找到所有可以“接触”到的箱子,对所有这些箱子推动,广度优先算法形成搜索树。然后和第一种方案基本相似的方式砍掉多余的树枝。

    这个方案我还没有实施,所以还没有想的很具体,先实现第一个在说。
    希望有兴趣的朋友可以给意见,告诉我还有那些死棋可以判断。
  • 相关阅读:
    MQTT研究之EMQ:【JAVA代码构建X509证书【续集】】
    MQTT研究之EMQ:【JAVA代码构建X509证书】
    MQTT研究之EMQ:【SSL证书链验证】
    自己DIY出来一个JSON结构化展示器
    Mac系统还原
    Mac初用
    工作中缓存使用方式的总结
    面试突击(八)——JVM的结构及内存模型,是怎么划分的?
    面试突击(七)——JVM如何加载Java字节码信息的?
    面试突击(六)——JVM如何实现JAVA代码一次编写到处运行的?
  • 原文地址:https://www.cnblogs.com/tansm/p/166490.html
Copyright © 2011-2022 走看看