zoukankan      html  css  js  c++  java
  • 汉诺塔的实现 c++

    汉诺塔问题:假设有从左到右有三个名字分别为x,y,z的塔座, 在塔座x上有n各直径大小各不相同,按照直径从小到大编号为1,2,。。。n的圆盘。现在要求将x轴上的n个圆盘移动到塔座z上,并且按同样的顺序叠排,圆盘移动规则如下

    1. 每次只能移动一个圆盘
    2. 圆盘可以插在任何一个塔座上
    3. 任何时刻小盘都必须在大盘之上

    思路如下:n=1的时候,问题最简单,直接把圆盘移动到z就行。当n>1的时候,就需要用y作为辅助塔座,设法将压在n上面的n-1

    的圆盘从x移动到y上,则可以把圆盘n移到z上面,再通过上面的办法把y上的圆盘移动到z上面。如何将n-1个圆盘从一个塔座移动到另外一个塔座是一个和原问题一样的问题,只是规模不相同。

    这里用vector来保存每一个塔座上的圆盘,当移动圆盘时,一个塔座的vector弹出最后面的元素, 一个塔座将前面弹出的圆盘添加到子集的vector中

     1 /*
     2     author: LaiXingYu
     3       date:2018/5/10
     4 */
     5 /*
     6     para: @n, number of plates, @x, @y, @z, move plates from x to z, via y;
     7 */
     8 void hanoi(int n, vector<int>& x, vector<int>& y, vector<int>& z){
     9     if(n == 1){
    10         z.push_back(x.back());
    11         x.pop_back();
    12         return;
    13     }else{
    14         hanoi(n-1, x, z, y);     //把n-1个盘子从x经过z移动到y
    15         z.push_back(x.back());   //把x剩下的盘子移动到z上
    16         x.pop_back();
    17         hanoi(n-1, y, x, z);     //把n-1个盘子从y经过x移动到z
    18     }
    19 }
    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    Chrome浏览器二维码生成插件
    《零成本实现Web性能测试:基于Apache JMeter》读书笔记
    《软件性能测试过程详解与案例剖析》读书笔记
    Python-Web-数据库-mongodb
    JAVA并发-基于AQS实现自己的显示锁
    FutureTask原理解析
    Linux上安装jdk,mysql
    Linux常用命令
    函数
    1.初识代码审计-基础
  • 原文地址:https://www.cnblogs.com/mr-stn/p/9022302.html
Copyright © 2011-2022 走看看