您的位置:首页 > 编程语言 > C语言/C++

递归算法——Hanoi(汉诺)问题(Java实现&C语言实现)

2016-10-13 19:52 344 查看
某寺庙前有三根柱子A、B、C,开始时A柱上有n个盘子,盘子大小不等,大的在下、小的在上(下图所示)。有一老和尚想把这n个盘子从A柱移到C柱上,但每次只允许移动一个盘子,且在移动过程序中每根柱子上都始终保持大盘在下、小盘在上。在移动过程中可以借助B柱。要求:正整数n由键盘输入。



Java实现:

import java.util.Scanner;

public class Test160916 {

public static void main(String[] args) {

System.out.println("请输入A塔上盘子的个数");

System.out.println("请输入一个整数后按回车键:");

Scanner scanner = new Scanner(System.in);

int n = scanner.nextInt();

hanoi(n, 'A', 'B', 'C');

scanner.close();
}

public static void move(char x, int n, char y){

System.out.println("把编号为["+n+"]盘从"+x+" 移动到 "+y);

}

public static void hanoi(int n,char A,char B,char C){

if(n==1){

move(A,1,C);

}else{
/*   步骤
*  第一步,移走最上面的盘子,剩下一个最大的
*   第二步,把最大的盘子移到目标盘
*  第三步,移回第一步的盘子到目标盘
*/
hanoi(n-1,A,C,B);//借助 【C】 把n-1个盘从【A】移到 【B】
move(A,n,C);//把最大的盘子移动到【C】
hanoi(n-1,B,A,C);//借助 【A】 把n-1个盘从【B】移到 【C】

}

}

}


输出结果:
请输入A塔上盘子的个数

请输入一个整数后按回车键:

3

把编号为[1]盘从A 移动到 C

把编号为[2]盘从A 移动到 B

把编号为[1]盘从C 移动到 B

把编号为[3]盘从A 移动到 C

把编号为[1]盘从B 移动到 A

把编号为[2]盘从B 移动到 C

把编号为[1]盘从A 移动到 C

C语言实现:

#include <stdio.h>

void move(char x, int n, char y){
printf("把编号为[%d]盘从 %c 移动到 %c \n",n,x,y);
}
void hanoi(int n,char A,char B,char C){
if(n==1){
move(A,1,C);
}else{
/*   步骤
*  第一步,移走最上面的盘子,剩下一个最大的
*   第二步,把最大的盘子移到目标盘
*  第三步,移回第一步的盘子到目标盘
*/
hanoi(n-1,A,C,B);//借助 【C】 把n-1个盘从【A】移到 【B】
move(A,n,C);//把最大的盘子移动到【C】
hanoi(n-1,B,A,C);//借助 【A】 把n-1个盘从【B】移到 【C】
}
}
int main() {
int n;
printf("请输入A塔上盘子的个数\n");
printf("请输入一个整数后按回车键:\n");
scanf("%d",&n);
hanoi(n, 'A', 'B', 'C');
return 0;
}



输出结果:



请输入A塔上盘子的个数

请输入一个整数后按回车键:

3

把编号为[1]盘从 A 移动到 C

把编号为[2]盘从 A 移动到 B

把编号为[1]盘从 C 移动到 B

把编号为[3]盘从 A 移动到 C

把编号为[1]盘从 B 移动到 A

把编号为[2]盘从 B 移动到 C

把编号为[1]盘从 A 移动到 C

Press any key to continue
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐