汉诺塔

  1. 汉诺塔是由三根杆子A,B,C组成的。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?汉诺塔是根据一个传说形成的一个问题:
    有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
    每次只能移动一个圆盘; 大盘不能叠在小盘上面。
    提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。 问:如何移?最少要移动多少次?
    在这里插入图片描述

namespace MyProject
{
class Program
{

    static void Main(string[] args)
    {
        Stack<int> a = new Stack<int>();
        a.Push(6); a.Push(5); a.Push(4); a.Push(3); a.Push(2); a.Push(1);
        HeNeiTA heNeiTAa = new HeNeiTA
        {
            stack = a,
            stacklx = "A"
        };
        Stack<int> b = new Stack<int>();
        HeNeiTA heNeiTAb = new HeNeiTA
        {
            stack = b,
            stacklx = "B"
        };
        Stack<int> c = new Stack<int>();
        HeNeiTA heNeiTAc = new HeNeiTA
        {
            stack = c,
            stacklx = "C"
        };
        heta(6, heNeiTAa, heNeiTAb, heNeiTAc);
    }


    public class HeNeiTA {
      public Stack<int> stack;
      public string stacklx;
    }



    public static void heta(int nums, HeNeiTA a, HeNeiTA b, HeNeiTA c)
    {
        if (nums == 1)
        {
            int zd = a.stack.Pop();
            c.stack.Push(zd);
            PrintLn(a, b, c, "A");
            PrintLn(a, b, c, "B");
            PrintLn(a, b, c, "C");
            Console.WriteLine();

        }
        else
        {
          
            heta(nums - 1, a, c, b);//a给b(nums-1)
            heta(1, a, b, c);//a给c  
            heta(nums - 1, b, a, c);//b给c(nums-1)
        }

    }

    public static void PrintLn(HeNeiTA a, HeNeiTA b, HeNeiTA c,string lx)
    {
        string List = "[";
        if (a.stacklx == lx) {
            foreach (int i in a.stack)
            {
                List += i + ",";
            }
            List = List.Trim(','); 
        }else if (b.stacklx == lx) {
            foreach (int i in b.stack)
            {
                List += i + ",";
            }
            List = List.Trim(',');
        }else if (c.stacklx == lx) {
            foreach (int i in c.stack)
            {
                List += i + ",";
            }
            List = List.Trim(',');
        }
        List += "]  ";
       Console.Write(List);
    }


}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值