欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于Java中Stack类实现的Hanoi塔问题解决算法

程序员文章站 2022-03-05 15:07:33
基于Java中Stack类实现的Hanoi塔问题解决算法算法伪代码伪代码伪代码的说明算法Java代码算法测试算法伪代码/* * @作者 : Mou Chaoli * @算法简介 : 基于递归的思想的Hanoi塔问题解决器.算法中用整数表示圆盘的大小. * 数字越大那么圆盘的大小越大. * */伪代码Algorithm : solveHanoi(A,C,n) // 将A柱上的n个盘子按要求移到C柱上 if n = 1...

基于Java中Stack类实现的Hanoi塔问题解决算法

算法伪代码

/*
 * @作者 : Mou Chaoli 
 * @算法简介 : 基于递归的思想的Hanoi塔问题解决器.算法中用整数表示圆盘的大小.
 *            数字越大那么圆盘的大小越大.
 * 
 */

伪代码

Algorithm :  solveHanoi(A,C,n)                   // 将A柱上的n个盘子按要求移到C柱上
     if n = 1 then moveHanoi(A,C)               // 将A柱上的1个盘子移到C柱上
     else solveHanoi(A,B,n-1)       
          moveHanoi(A,C)
          solveHanoi(B,C,n-1)

伪代码的说明

      I. A,B,C采用Stack类实现
      II. HanoiTowerSolver : Hanoi塔问题的解决类
      III. solveHanoi : HanoiTowerSolver的方法,用于解决Hanoi塔问题
      IV. moveHanoi : 移动操作

算法Java代码

public class HanoiTowerSolver
{	
	static int moveTimes = 0;
	Stack A = new Stack();
	Stack B = new Stack();
	Stack C = new Stack();
	
	public HanoiTowerSolver(int numOfPlates)
	{
		System.out.println("|Hanoi Tower|----> Generating A B C...");
		int tempNumOfPlates = numOfPlates;
		for(int i=0 ; i<numOfPlates ; i++)
		{
			A.push(tempNumOfPlates);
			tempNumOfPlates--;
		}
		System.out.println("|Hanoi Tower|----> Generating A B C Done.");
		System.out.println("|Hanoi Tower|----> Display A B C :");
		System.out.println("A: "+A);
		System.out.println("B: "+B);
		System.out.println("C: "+C);
	}
	
	
	public void solveHanoi(Stack origPillar,Stack finaPillar,Stack tempPillar,int n)
	{
		
		  if(n == 1)
	      {
	         moveHanoi(origPillar,finaPillar);
	         return;
	      }
	      else
          {
	    	 solveHanoi(origPillar,tempPillar,finaPillar,n-1);
	         moveHanoi(origPillar,finaPillar);
	         solveHanoi(tempPillar,finaPillar,origPillar,n-1);
	      }
	}
	
	public static void moveHanoi(Stack origPillar,Stack finaPillar)
	{
		//origPillar  remove *
		//finaPillar  add *	
		finaPillar.push(origPillar.pop());
        moveTimes++;
	}
	
	
	public static void main(String[] args)
	{
		Scanner scanner = new Scanner(System.in);
		System.out.println("|Hanoi Tower|----> Please enter the number of plates: ");
		int n = scanner.nextInt();
		HanoiTowerSolver Hanoi = new HanoiTowerSolver(n);
		
		Hanoi.solveHanoi(Hanoi.A,Hanoi.C,Hanoi.B,n);
		
		//检验结果
		//若算法成功,最终输入的C应该是从大到小排序的数列即其中的元素是与原始的A一致的.
		System.out.println("|Hanoi Tower|----> The final pillar C is: "+Hanoi.C);
		System.out.println("|Hanoi Tower|----> The total number of moves is: "+moveTimes);
	}

}

算法测试

|Hanoi Tower|----> Please enter the number of plates: 
6
|Hanoi Tower|----> Generating A B C...
|Hanoi Tower|----> Generating A B C Done.
|Hanoi Tower|----> Display A B C :
A: [6, 5, 4, 3, 2, 1]
B: []
C: []
|Hanoi Tower|----> The final pillar C is: [6, 5, 4, 3, 2, 1]
|Hanoi Tower|----> The total number of moves is: 63

本文地址:https://blog.csdn.net/Matlab16/article/details/109902300