用栈来求解汉诺塔问题

【题目】post

汉诺塔问题比较经典,这里修改一下游戏规则:如今限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须通过中间。求当塔有N层的时候,打印最优移动过程和最优移动总步数。.net

例如,当塔数为两层时,最上层的塔记为1,最下层的塔记为3d

2,则打印:cdn

注意:关于汉诺塔游戏的更多讨论,将在本书递归与动态规划的章节中继续。blog

【要求】递归

用如下两种方法解决。游戏

方法一:递归的方法;qt

方法二:非递归的方法,用栈来模拟汉诺塔的三个塔;it

本文将讲述方法一:io

【解答】

方法一:递归的方法。

首先,若是只剩最上层的塔须要移动,则有以下处理

1.若是但愿从“左”移到“中”,打印“Move1 from left to mid”。

2.若是但愿从“中”移到“左”,打印“Move1 from mid to left”。

3.若是但愿从“中”移到“右”,打印“Move1 from mid to right”。

4.若是但愿从“右”移到“中”,打印“Mve1 from right to mid”。

5.若是但愿从“左”移到“右”,打印"Move1 from left to mid”和"Move1 from mid to right"。

6.若是但愿从“右”移到“左”,打印“Move1 from right to mid"和“Move1 from mid to left”。

以上过程就是递归的终止条件,也就是只剩上层塔时的打印过程。

接下来,咱们分析剩下多层塔的状况。

若是剩下N层塔,从最上到最下依次为1~N,则有以下判断:

1.若是剩下的N层塔都在“左”,但愿所有移到“中”,则有三个步骤。

1)将1~N-1层塔先所有从“左”移到“右”,明显交给递归过程。

2)将第N层塔从“左”移到“中”。

3)再将1~N-1层塔所有从“右”移到“中”,明显交给递归过程。

2.若是把剩下的N层塔从“中”移到“左”,从“中”移到“右”,从“右”移到“中”,过程与状况1同理,同样是分解为三步,在此再也不详述。

3.若是剩下的N层塔都在“左”,但愿所有移到“右”,则有五个步骤。

1)将1~N-1层塔先所有从“左”移到“右”,明显交给递归过程。

2)将第N层塔从“左”移到“中”。

3)将1~N-1层塔所有从“右”移到明显交给递归过程。

4)将第N层塔从“中”移到“右”。

5)最后将1~N-1层塔所有从“左”移到“右”,明显交给递归过程。

4.若是剩下的N层塔都在“右”,但愿所有移到“左”,过程与状况3同理,同样是分解为五步,在此再也不详述。

以上递归过程通过逻辑化简以后的代码请参看以下代码中的hanoi Problem1方法。

欢迎一块儿来交流代码那点事:https://mp.csdn.net/postedit/80325970?utm_source=zwqt

pgc-image/152699529623017eaf2ec59

相关文章
相关标签/搜索