汉诺(Hanoi)塔问题(C#版)

     问题描述:古代有一个梵塔,塔内有3个座,A、B、C,开始时A座有64个盘,盘子大小不等,大的在上,小的在下。有一个老和尚想把这64个盘子从A座移到C座(如图所示),但每次只允许移动一个盘,且在移动过程中在3个座上始终保持大盘在下,小盘在上。在移动地程中可以行用B座,要求编程序打印出移动的步骤。

 

   逆向推理:1.假如一个和尚能把上面63个盘子先搬到B座,第二个和尚再把最大的那个移到C,第三个和尚再把63个盘子移到C座;至此整个工作就完成的。

   2.问题是怎么才能把63个盘子移到B座,按照同样的方法,先把62个盘子选移到C座

,再把第63个盘子移到B座,最后再将62个盘子移到B座。

   3……如此类推;

   4.从上面分析可以看出:只有等后面那个和尚搬完盘子,前面的和尚才能够去完成任。让我们来栈的数据结构:数据的处理只在一端处理,且是先进后出。所以用递归的方法去处理是正确的。

 
       (汉诺塔图)

using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  HanoiProgram
{
    
class  Program
    {
      
static   int  count  =   0 ; // 计数,总共搬动盘子的次数;
       static    void  PrintMove( char  x, char  y)
        {
            Console.WriteLine(
" {0}-->{1} " ,x,y);
        
        }

       
static   void  Hanoi( int  n, char  one,  char  two, char  three)
        {
            
if  (n  ==   1 )
            {
                
++ count;
                PrintMove(one, three);
                
            }
            
else
            {
                
++ count;
                
// 借助中间塔把第N个盘上面(n-1)个盘子的搬移到另一个盘;
                Hanoi(n - 1 ,one,three,two);
                
// 打印第N个盘移到目标塔的步骤;
                PrintMove(one,three);
                
// 借助中间塔把原来第N个盘子上面的(n-1)个盘子搬到现在第N个盘子所在的塔上;
               
                Hanoi(n
- 1 ,two,one,three);
            }
        
        }
        
static   void  Main( string [] args)
        {
            Console.WriteLine(
" 开始搬64个盘子.. " );
            Hanoi(
4 , ' A ' , ' B ' , ' C ' );
            Console.WriteLine(
" 搬迁结速;一共进行了{0}次的搬迁。 " ,count);
            Console.Read();
        }
    }
}


转载于:https://www.cnblogs.com/kyovcs/archive/2007/09/03/880576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值