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

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

递归算法——Hanoi(汉诺)问题(Java实现&C语言实现)_第1张图片

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 

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




你可能感兴趣的:(Java,算法,C语言)