大家好,欢迎来到IT知识分享网。
1.游戏规则
汉诺塔(Hanoi)游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个盘子。游戏的目标:把A杆上的盘子全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上。操作过程中盘子可以置于A、B、C任一杆上。
根据汉诺塔游戏的介绍我们可以得出两条重要的规则:
1.一次只能移动一个盘子
2.在移动的过程中我们要保证三根杆上的盘子大盘在下,小盘在上(即由上到下从小到大排列)
2.思路解析
1.当只有一个盘子的时候,我们只需将这一个盘子移到最后一根柱子即可解决问题。
2.当有两个盘子的时候:
初始情况是这样的
依据规则中的:在移动过程中三根杆上都始终保持大盘在下,小盘在上。我们可以得出在解决问题前的一个步骤所展示的情况如下
3.当有三个盘子的时候,初始情况如下:
依据规则,我们在将最大的盘子移动到 C 柱的时候,其他两个盘子的情况应该是是这样的:
然后我们再将盘子按照规则依次移动使得三个盘子有序的放在 C 柱上
以此类推我们可以发现,假设有n个盘子,当最大的盘子移动到C柱上的时候,n-1个盘子都有序的放在B柱上,而第(n-1)个柱子要做的是将盘子通过A柱(中转柱),从B柱(初始柱)移动到C柱(最终柱),当移动完成后我们又会发现剩下(n-2)个盘子有序的放在B柱上。根据这个规律,我们可以写出代码
Hanoi(n - 1, pos1, pos3, pos2); move(pos1, pos3); Hanoi(n - 1, pos2, pos1, pos3);
即我们先将(n-1)个盘子从初始柱A通过中转柱C移动到最终柱B后,将第n个盘子从A柱移动到C柱,然后再将(n-1)个柱子执行上述的指令即可解决问题。
3.最终代码
我们首先定义一个函数来实现我们盘子移动的功能:
void move(char pos1, char pos2) { printf("%c -> %c\t", pos1,pos2); }
接着我们定义一个解决问题的函数:
void Hanoi(int n,char pos1, char pos2, char pos3) { if (n == 1) { move(pos1, pos3); } else { Hanoi(n - 1, pos1, pos3, pos2); move(pos1, pos3); Hanoi(n - 1, pos2, pos1, pos3); } }
最后我们通过主函数来实现他
int main() { Hanoi(3,'A','B','C'); return 0; }
完整代码如下:
#include<stdio.h> void move(char pos1, char pos2) { printf("%c -> %c\t", pos1,pos2); } void Hanoi(int n,char pos1, char pos2, char pos3) { if (n == 1) { move(pos1, pos3); } else { Hanoi(n - 1, pos1, pos3, pos2); move(pos1, pos3); Hanoi(n - 1, pos2, pos1, pos3); } } int main() { Hanoi(3,'A','B','C'); return 0; }
运行结果如下
以上就是汉诺塔问题的解析和代码实现
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/153251.html