zoukankan      html  css  js  c++  java
  • 奇偶剪枝

    问题描述

    在一个n行m列的迷宫中,每一步只能向上、下、左、右中任意方向走一格,迷宫中有围墙的地方是无法到达的。从起点s开始,能否刚好走t步,到达e。

    例如在下面5行5列的迷宫中,能否恰好经过9步,从s走到e。初始位置在s上,#是围墙。

     

    奇偶剪枝

    设起点s的坐标为(sx,sy),终点e的坐标为(ex,ey);

    对s的一次操作为对sx或sy进行+1或-1;

    若经过t次操作后,s的坐标刚好等于e,则说从s经过t步可以到达e。

    在理想情况下,s到e需要的最小步数为m

    m=|ex-sx|+|ey-sy|

    若t<m,肯定是无法到达的。

    当t>=m时,从s到e的行走路径由两部分组成,

    一部分为需要走的最少步数m;

    另一部分是为了使得刚好行走t步到达e,所需要走的附加步数a,a=t-m;

    这a步即为:从需要走m步的最短路径上走出去,再回到最短路径上所走的步数。

    假设走出去这段路径长度为b,那回来时的路径长度一定也是b,因此,附加步数的路径长度a等于2b步。

    因为走出去时,对坐标进行了b次+1或-1的操作,为使坐标再恢复到最短路径上,就需要进行b次-1或+1的操作,并且与走出去时是相反的。注意:走出去和拐回来的过程中可能参杂着最短路径上的操作,所以b是除去这些参杂操作后的步数。

    如下图所示:

    从s到e的黑色路径为一条最短路径,红色和蓝色路线组成的路径,为走出最短路径的路径。其中蓝色箭头是参杂着的最短路径中的操作,只有红色箭头才是走出去和拐回来的路径,如果将红色路径去掉,从s向右走,经过绿色箭头到达e,这也是一条最短路径。

    因为a=2b,是个偶数,又因为a=t-m,所以当t和m的奇偶性相同时,a才能是偶数。也就是说,当t和m的奇偶性相同时,才有可能从s经过t步,到达e。

    所以,当最小步数m与t同为奇数,或同为偶数时,才有可能从s经过t步,到达e。

    简单来说,就是总的步数-已经走了的步数-fabs(now.x-end.x)-fabs(now.y-end.y),这个值得是偶数,且大于等于0

  • 相关阅读:
    laravel 安装及入门
    mysql事务处理的意义
    PHP项目:如何用PHP高并发检索数据库?
    inner join、left join、right join等的区别
    百度地图引入网页中
    google地图引入网页
    thinkphp的mvc理解
    SpringBoot+Shiro入门小栗子
    Springboot+WebSocket+Kafka(写着玩的)
    Windows下安装单机Kafka
  • 原文地址:https://www.cnblogs.com/huzhenbo113/p/3228878.html
Copyright © 2011-2022 走看看