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://bianchenghao.cn/bian-cheng-ji-chu/85684.html