这是许多人手动解决的普遍难题。现在是时候编写一种算法来解决该问题了。
在彼此面对的两个不同侧面上排列有相等数量的火柴棍。它们之间只有一个空白空间。说出类似下图的内容(如果火柴总数为4)。
每个摇杆都可以向前滑动一步(如果紧邻的前部空间是空的),也可以跳过它们前面的一根摇杆,然后降落到自由空间中(如果该空间是空的)。反向移动是不可能的(即使空间是空的)。也不允许反向跳转。一步只能执行一次移动。
现在,您必须编写一种算法来查找所需的最小步骤,所有左手火柴将落在右侧,而所有右手火柴将落在左侧。
例如:如果总共有2个火柴棒(每侧1个),则步骤为:
注意:在上图中,首先移动了左侧操纵杆。当右侧操纵杆先移动时,存在另一种解决方案。但是对于这个问题,您只需要给出一个解决方案,并且还假设左侧操纵杆先移动。
下图描述了使用4个火柴棍(每侧2个)的移动:
注意:在上图中,首先移动了左侧操纵杆。当右侧操纵杆先移动时,存在另一种解决方案。但是对于这个问题,您只需要给出一个解决方案,并且还假设左侧操纵杆先移动。
[假设:输入可以是02到14之间的任何偶数(即每侧1到7个火柴)。对于此范围之外的输入,您不需要进行任何验证,也不需要提供任何错误消息。注意:在输出中,每个步骤都由一个'|'分隔 (管道)字符。COBOL程序员应始终将PIC 9(2)作为输入大小,并且还可以将输出假定为固定的最大长度450个字符,并在右边填充空格。
样本输入:
02
样本输出:
01To02|03To01|02To03|
样本输入:
04
样本输出:
02To03|04To02|05To04|03To05|01To03|02To01|04To02|03To04|
样本输入:
06
样本输出:
03To04|05To03|06To05|04To06|02To04|01To02|03To01|05To03|07To05|06To07|04To06|02To04|03To02|05To03|04To05|