目录
1.前言
2.问题描述
3.问题分析
4.定义一个主函数
5.再定义一个hanoi函数
6.所有代码
7.结语
1.前言
汉诺塔问题,是心理学实验研究常用的任务之一。该问题的主要材料包括三根高度相同的柱子和一些大小及颜色不同的圆盘,三根柱子分别为起始柱A、辅助柱B及目标柱C。
2.问题描述
这里需要解决的是,将A柱子中的所有圆盘通过辅助柱B全部转移到C柱子上,并且圆盘的颜色顺序不变。
由于颜色容易搞混,所以我们这里假设A柱子中的圆盘大小不同,从上往下依次递减,也就是说,在移动的过程中,小的盘子在上面,大的盘子在下面,不能改变顺序。
3.问题分析
要使得A柱子上的最底部的一个盘子放在C柱子上,不管A柱子上有多少盘子,必须得把A柱子上除了最底部的盘子外的其他所有盘子都先转移到B柱子上,然后,再把最后一个盘子放入C柱子的最底部,接着,把B柱子中的盘子通过A柱子按大小顺序依次放入C柱子中。
4.定义一个主函数
int main()
{
int n = 0;
scanf("%d", &n);
//输入n可以自定义盘子的多少
hanoi(n,'A', 'B', 'C');
//向hanoi函数中传入A,B,C三个字符,用于辅助盘子的交换,记住,一定是传三个字符,要不然传的时候不显示A,B,C
return 0;
}
5.再定义一个hanoi函数
这个函数要实现这样一个功能,先把除了A柱子最底部的一个盘子外所有盘子通过柱子C全部转移到柱子B上,再把最后A底部的最后一个盘子转移到柱子C上,接着,再通过柱子A将B中的所有盘子转移到柱子C上。
在这里分为两种情况:
一、当最开始时A柱子上只有1个盘子时,将A柱子上的盘子直接转移到C上
二、当最开始时A柱子上盘子的数量大于等于2时,先将A中的除了最后一个外的所有盘子都通过C转移给B(在这里过程不重要,所以不要考虑过程,只考虑结果就行了),再将B中的除了最后一个外的所有盘子都通过A转移给C
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("%c -> %c\n", A, C);
//当最开始时A柱子上只有一个盘子时,将A柱子上的盘子直接转移到C上
}
else
{
hanoi(n - 1, A, C, B);
//将A中的除了最后一个外的所有盘子都通过C转移给B(在这里过程不重要,所以不要考虑过程,只考虑结果就行了)
printf("%c -> %c\n", A, C);
hanoi(n - 1, B, A, C);
//将B中的除了最后一个外的所有盘子都通过A转移给C(这里也不考虑过程)
}
}
6.所有代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void hanoi(int n, char A, char B, char C)
{
if (n == 1)
{
printf("%c -> %c\n", A, C);
//当最开始时A柱子上只有一个盘子时,将A柱子上的盘子直接转移到C上
}
else
{
hanoi(n - 1, A, C, B);
//将A中的除了最后一个外的所有盘子都通过C转移给B(在这里过程不重要,所以不要考虑过程,只考虑结果就行了)
printf("%c -> %c\n", A, C);
hanoi(n - 1, B, A, C);
//将B中的除了最后一个外的所有盘子都通过A转移给C
}
}
int main()
{
int n = 0;
scanf("%d", &n);
//输入n可以自定义盘子的多少
hanoi(n,'A', 'B', 'C');
//向hanoi函数中传入A,B,C三个字符,用于辅助盘子的交换,记住,一定是传三个字符,要不然传的时候不显示A,B,C
return 0;
}
7.结语
今天的经验分享就到这里,有喜欢的朋友可以点赞➕评论➕收藏➕关注,如果有不懂的地方可以咨询博主,谢谢大家支持博主!