C++ 汉诺塔程序实现

article/2025/9/17 23:47:46

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 

首先不看代码,汉诺塔解题步骤有三步(设A->C),先将汉诺塔看成两部分n-1,1(n-1在上面)
第一:将A中的n-1个盘借助C移到B  ===>Hanoi(n-1,a,c,b);
第二:将A中的最下面的那一个移到C===>move(a,c);
第三:将B中的盘借助A移到C.===>Hanoi(n-1,b,a,c);

###################################################

yuanzhen@ubuntu:~/C_script$ cat myhanno.cpp 
#include <vector>
#include <iostream>
#include <cstdlib>
#include <map>

using std::vector;
using std::cout;
using std::endl;
using std::cin;
using std::map;
using std::make_pair;

typedef map<char, int> CharMap;

vector<vector<int> > vec;
CharMap colm;

CharMap init_map()       //用于根据字符以确定将移动的 起始列和目的列
{
    CharMap mymap;
    mymap.insert(make_pair<char, int>('A',0));
    mymap.insert(make_pair<char, int>('B',1));
    mymap.insert(make_pair<char, int>('C',2));
    return mymap;
}

void show(vector<vector<int> > veca)     //用于呈现容器vector
{
    cout <<"A" << "\t" << "B" << "\t" << "C" << endl;
    cout << "---------------------" << endl;
    vector<vector<int> >::const_iterator vec_it;
    vector<int>::const_iterator it;
    for(vec_it=veca.begin(); vec_it!=veca.end();++vec_it)
    {
        for (it=(*vec_it).begin();it!=(*vec_it).end();++it)
        {
            std::cout << *it << "\t";
        }
        std::cout << std::endl;
    }
}

int start_row_num(vector<vector<int> > tvec, char A)   //用于确定移动其实字符所属的行数
{
    int i=0;
    int col=colm[A];
    vector<vector<int> >::const_iterator cit;
    for(cit=tvec.begin();cit != tvec.end();++cit)
    {
        //cout << (*cit)[0] << endl;
        if((*cit)[col]!=0)
          return i;
        i++;
    }
}

int dest_row_num(vector<vector<int> > tvec, char C)  //用于确定移动目标字符所属的行数
{
    int i=0;
    int col=colm[C];
    vector<vector<int> >::const_iterator cit;
    for(cit=tvec.begin(); cit!=tvec.end();++cit)
    {
        //cout <<"a" << endl;
        if((*cit)[col]!=0)
          return i-1;
        i++;
    }
    return i-1;
}

void move(char A, char C)              //根据算法结果来改变 vector,而在本程序中的改变就是交换A列的

                                                        //第一个非零数字和C列的最后一个0数字
{
    int start_x=start_row_num(vec,A);
    int start_y=colm[A];
    int dest_x=dest_row_num(vec,C);
    int dest_y=colm[C];

    //cout << "(" << start_x << "," << start_y << ")" << "(" << dest_x << "," << dest_y << ")" << endl;
    int temp=vec[start_x][start_y];
    vec[start_x][start_y]=vec[dest_x][dest_y];
    vec[dest_x][dest_y]=temp;
    cout << endl;
    cout << endl;
    cout << A << "--------------->" << C << endl;
    cout << endl;
    show(vec);
}

void hanno(int n, char A, char B, char C)   //汉诺塔算法使用递归方法实现的(但是此方法应该不是最快的实现方式,但确实最容易理解的方式)
{
    if(n==1)
      move(A,C);
    else
    {
        hanno(n-1, A, C, B);
        move(A,C);
        hanno(n-1, B, A, C);

    }
}

vector<vector<int> > init(int n)    //根据输入的 n 来初始化vector
{
    vector<vector<int> > veca(n, vector<int> (3,0));
    vector<vector<int> >::iterator vec_it;
    int i=0;
    for(vec_it=veca.begin(); vec_it!=veca.end();++vec_it)
    {
        *(*vec_it).begin()=i;
        i++;
    }
    return veca;
}

int main(void)
{
    int n;
    cin >> n;
    system("clear");
    vec=init(n+1);  // n*3 wei vector
    colm=init_map();
    show(vec);
    hanno(n, 'A','B','C');
}
#########################################

运行程序(注意示例n为3):

3

A    B    C
---------------------
0    0    0    
1    0    0    
2    0    0    
3    0    0    


A--------------->C

A    B    C
---------------------
0    0    0    
0    0    0    
2    0    0    
3    0    1    


A--------------->B

A    B    C
---------------------
0    0    0    
0    0    0    
0    0    0    
3    2    1    


C--------------->B

A    B    C
---------------------
0    0    0    
0    0    0    
0    1    0    
3    2    0    


A--------------->C

A    B    C
---------------------
0    0    0    
0    0    0    
0    1    0    
0    2    3    


B--------------->A

A    B    C
---------------------
0    0    0    
0    0    0    
0    0    0    
1    2    3    


B--------------->C

A    B    C
---------------------
0    0    0    
0    0    0    
0    0    2    
1    0    3    


A--------------->C

A    B    C
---------------------
0    0    0    
0    0    1    
0    0    2    
0    0    3    
 

转载于:https://my.oschina.net/lCQ3FC3/blog/821808


http://chatgpt.dhexx.cn/article/0Ig7poLZ.shtml

相关文章

【算法与数据结构】汉诺塔

数据结构里的汉诺塔&#xff0c;递归的典型代表&#xff0c;几乎讲到递归都会讲到汉诺塔&#xff0c;今天才把汉诺塔看明白&#xff0c;惭愧啊。 不废话了&#xff0c;贴代码&#xff0c;基本思想在注释里有&#xff0c;话说往CNBLOG首页投了两次&#xff0c;两次都被小编给扯下…

递归-汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 递归&#xff08;recursion&#xff09;&#xff1a;程序调用自身的编程技巧。 反复执行的过程&#xff08;调用自身&#xff09;有跳出反复执行过程的条件&#xff08;递归出口&#xff09; import com.lifeibigdata.al…

汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 前提说明&#xff1a; ‍算法&#xff1a;当只有一个盘子的时候&#xff0c;只需要从将A塔上的一个盘子移到C塔上。 当A塔上有两个盘子是&#xff0c;先将A塔上的1号盘子&#xff08;编号从上到下&#xff09;移动到B塔上…

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手&#xff0c;看到的不喜勿喷&#xff0c;还望大神指教。 随着Node.js&#xff0c;Angular.js,JQuery的流行&#xff0c;点燃了我学习JavaScript的热情&#xff01;以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现&#xff0c;加快学习JS的步伐&…

【C语言】递归的经典问题(模拟strlen,阶乘,斐波那契数列,汉诺塔,青蛙跳台阶)

以下我分享的是关于C语言递归的比较经典的题&#xff0c;有些题提供了多种解法&#xff0c;希望可以帮助你打开思路&#xff0c;如果你有更多的解法&#xff0c;欢迎评论区留言哟~ 目录 一、输入1234&#xff0c;输出1 2 3 4 二、模拟strlen功能 1&#xff09;递归 2&…

7.递归-汉诺塔

汉诺塔问题&#xff1a; 如果求解的汉诺塔是3层&#xff0c;可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b&#xff0c;再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c&#xff0c;通过a为中介。 算法分析&#xff08;递归算法&#xff09; 我…

数据结构与算法之汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 一、汉诺塔问题 1.汉诺塔问题 起源&#xff1a;一位法国数学家曾编写过一个印度的古老传说&#xff1a;在世界中心贝拿勒斯的圣庙里&#xff0c;一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&#xff…

汉诺塔 最优算法设计商量

2019独角兽企业重金招聘Python工程师标准>>> 引言 汉诺塔算法一向是算法设计科目标最具代表性的研究题目&#xff0c;本文存眷于如何设计多柱汉诺塔最优算法的商量。最简单的汉诺塔是三个柱子&#xff08;A、B、C&#xff09;&#xff0c;是以多柱汉诺塔的柱子个数M…

函数递归与汉诺塔

C初阶之函数递归 函数递归基本原理 什么是递归&#xff1f;程序调用自身的编程技巧称为递归recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解&#xff0c;…

分治算法的解和幂乘算法及其优化以及汉诺塔算法的介绍

分治算法就是分成若干个和原问题一样性质的子问题&#xff0c;然后逐步递归这些子问题&#xff0c;直到遇到规模很小的子问题&#xff0c;求出子问题的解&#xff0c;归结成原问题的解的算法就是分治算法 分治算法为递归问题&#xff0c;可以用来解决快排、二分归并、斐波那契数…

递归求解汉诺塔问题(详细解答)

汉诺塔移动步数的计算 具体汉诺塔的规则大家自行百度吧&#xff0c;就不介绍了&#xff0c;这里介绍一下如何求解汉诺塔移动步数的计算思想。 当汉诺塔层数为一层时&#xff0c;很显然只需要一步&#xff0c;直接从A杆移动到C杆 当层数为两层时&#xff0c;则需要三步&#x…

汉诺塔算法

2019独角兽企业重金招聘Python工程师标准>>> 有A、B和C 3跟柱子&#xff0c;在A上从下往上按照从小到大的顺序放着64个圆盘&#xff0c;以B为中介&#xff0c;把盘子全部移动到C上。移动过程中&#xff0c;要求任意盘子的下面要么没有盘子&#xff0c;要么只能有比它…

汉诺塔算法的理解

2019独角兽企业重金招聘Python工程师标准>>> 当盘子数为两个时&#xff0c;移动图如下&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AB22AC31BC 当盘子数为3个时&#xff1a; 移动规律为&#xff1a; 步骤盘子编号源柱子目标柱子11AC22AB31CB4…

汉诺塔递归算法

2019独角兽企业重金招聘Python工程师标准>>> import java.util.Scanner;/*** 汉诺塔* * author JayChang* */ public class HanoiResolve {/*** 移动位置* * param positionA* param positionB*/public static void move(String positionA, String positionB) {Syst…

数据结构——树和二叉树 6-1 求二叉树高度 (20 分)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

PTA 函数题 求二叉树高度(C语言)

本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT ); 其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

6-1 求二叉树高度

6-1 求二叉树高度 (15 分) 本题要求给定二叉树的高度。 函数接口定义&#xff1a; int GetHeight( BinTree BT );其中BinTree结构定义如下&#xff1a; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Rig…

二叉树的构造及求解二叉树高度

题目描述 1、参考题目解释构造一棵二叉树&#xff1b; 2、求解二叉树的高度 3、有余力同学尝试打印这棵二叉树&#xff08;以树的形态&#xff0c;非必须&#xff09; 输入 A(B(E,C(D(F(,G),),) 输出 二叉树高度为: 6 代码实现 #include <iostream> //#include &l…

二叉树4:二叉树求树高度(超级详细)

一、思路 什么是树高&#xff1f; 树的高度(或深度)就是树中结点的最大层数。 在这里使用后序遍历的递归算法。 对每一个结点都进行如下操作&#xff1a; 后序遍历其左子树求树高后序遍历其右子树求树高对这个结点进行下面操作&#xff1a; 比较其左右子树的高度大小若左&g…

二叉树的高度和深度

二叉树的高度和深度定义 &#xff08;对某个节点来说&#xff09; 深度是指从根节点到该节点的最长简单路径边的条数&#xff1b; 高度是指从最下面的叶子节点到该节点的最长简单路径边的条数&#xff1b; &#xff08;对二叉树&#xff09; 深度是从根节点数到它的叶节点&…