棋盘空格的移动问题

问题描述:

    有一个5×5的方格棋盘,棋盘上放着24颗不同的棋子,分别用英文大写字母A,B, …,X 来表示,棋盘上还有一个方格空着。游戏的每一步是将空格上、下、左、右中的一颗棋子移入空格,这四种操作分别用1、2、3、4来表示。

    如果给出棋盘的初始状态和一定顺序的有限操作序列,就可以得到唯一的目标状态。

    现已知棋盘的初态、终态和被打乱后的操作序列( 操作序列长度 L<=50 ),要求计算和输出原来正确的操作序列。若无解,则输出0。

解法讨论:

        猛一看,解这个问题似乎无从下手。但看到5×5的棋盘及所要求的操作序列,就想到这是否是一个图的问题?顺着这个思路先把棋盘抽象成一个二维的图,棋盘中的每个格子就对应着图的一个结点,每个结点必须且只能与它上、下、左、右四个相邻的结点相连(位于图四个边缘上的结点则相应地减少相连结点)。这样一来,要求的对棋盘的操作序列怎样才能得到呢?这种操作对这张图来说又意味着什么?

        重新审视题目,如果换一个角度,不是从移动的棋子而是从棋盘中空格的角度来看,又会怎么样?很明显,从这个角度看,从棋盘初态到终态实际上可以看作空格的移动的结果。呵,看来思路是对头了,移动的棋子实际上构成了棋盘上空格的移动路径。那么这个问题就变成了:已知棋盘的初态和终态,求空格所走过的路径;再进一步,这个问题可以抽象为,已知一张二维图(图中各结点的连接要求如前)中的两个结点,求连接此两结点的路径。哈哈,这不就是典型的图的搜索问题吗?然后自然想到深度优先、广度优先这类算法。

       一般的针对图的路径搜索问题,是给定两个结点要求这两个结点的一条路径,如果对路径没有其它要求,只要能连通两个结点就可,那么简单地用一个深度优先就可做到;一般再实用点或复杂点的,就要求找到一条最短路径,那么用一个广度优先也可以解决了。但这些对解决当前问题来说是不够的。

       问题中说操作序列是给定的,只不过顺序打乱了,而且这个操作序列不一定有解;也就是说如果顺序没打乱,那么按照给出的操作顺序,由棋盘的初态也不一定能得到棋盘的终态。这就很有意思了。操作序列中的一个操作实际上就表示空格的一种移动方式,而且是相对空格当前位置的一种移动。很明显一个操作序列只能有上、下、左、右四种操作,也就是说不论空格当前在什么位置,它只能做下、上、右、左四种移动。所谓给出的一个顺序打乱的操作序列,实际上就是对空格的移动方式作出了限制,一个打乱顺序的操作序列实际上就对应着这样几个已知条件:空格左移次数,右移次数,上移次数,下移次数是已知的。

       总结一下,原来的问题就变成了这样的描述:

       已知一张二维的图(图中各结点的连接要求如前)及图中两个结点A、B,求连通A、B的一条路径,而且从A出发到B的过程中,上移、下移、左移、右移的次数都已知。如果这条路径存在,请输出结果,如果此路径不存在则输出0。

       先考虑,在什么情况下这条路径不存在?很明显,如果不给出移动次数的限制的话,这张图中任意两个结点都是可以连通的,也就是路径肯定存在。假设两个结点纵向上相差h个结点,也就是说从A出发向上(或向下)最少要移动h步才能到达与B同一高度;水平方向上相差d个结点,也就是说从A出向左(或向右)最少要移动d步才能与B处于同一列上;那么可以想象,如果给出的操作序列中:上移次数+下移次数 != h 或者 左移次数+右移次数 != d 都会使从A出发的空格错过B结点的,也就是说路径不存在。

       那么当 上移次数+下移次数 == h 并且 左移次数+右移次数 == d 时,如何才能求得正确的操作序列,或者说路径呢?

       在图中求路径当然得用到深度优先算法,只是要在此基础上作一些限制。最直接的方法是设置四个计数器,将其初值设为已知的各方向的移动次数,在作深度优先的递归调用时,根据当前的探测方向,对相应的计数器作减一操作,当其中两个计数器对(上与下为一对,左与右为一对)的值都为0时,还未到达目标结点,那么这个探测方向就失败,递归函数需要返回,返回时要把相应计数器作加一操作。当任意一个计数器值为0 时,则相应方向上的探测就自动屏蔽(例如,假设上移计数器值为0,而其它计数器值都大于0,则下一步就只能向下,向左或向右进行探测了)。

       如果用广度优先的话,就需要对每一次探测时的四个方向计数器值都作记录。相比较之下,可能深度优先更简单些。

      很多问题看起来毫无头绪,但只要经过分析找到它背后隐藏的数据结构,就可以借助已掌握的知识来解决它了。尤其对于一些竞赛题或者笔试题,这种方法常常奏效。

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/yzfuture2010/article/details/7980781
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞