汉诺塔问题

有三根杆子A,B,C。A杆上有 N 个 (N>1) 穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至 C 杆:
1、每次只能移动一个圆盘;
2、大盘不能叠在小盘上面。
提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。

问:如何移?最少要移动多少次?

算法求解:
解法的基本思想是递归。假设有 A、B、C 三个塔,A 塔有N块盘,目标是把这些盘全部移到 C 塔。那么先把 A 塔顶部的N-1块盘移动到 B 塔,再把 A 塔剩下的大盘移到 C,最后把 B 塔的N-1块盘移到 C。
如此递归地使用下去, 就可以求解。

1
2
3
4
5
6
7
8
9
10
11
12
void hannoi (int n, char from, char buffer, char to)
{
if (n == 0)
{
return;
}

hannoi (n - 1, from, to, buffer); //那么先把 A 塔顶部的N-1块盘移动到 B 塔
cout << "Move disk " << n << " from " << from << " to " << to << endl;

hannoi (n - 1, buffer, from, to); //A 塔剩下的大盘移到 C,最后把 B 塔的 N-1块盘移到 C。
}

  • 扩展欧几里得算法

    扩展欧几里得算法 用于求ax+by=gcd(a, b); 代码实现: 1234567def ext_euclid(a, b): if b == 0: return 1, 0, a else: ...

    扩展欧几里得算法
  • gcd算法

    gcd算法 欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的正整数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。 证明: a可以表示成a = kb + r(a,b...

    gcd算法
  • 最短路径

    最短路径 建立邻接表(邻接矩阵也可以)12345678struct Node{ int v; //顶点 int dis; //权值 Node(int x, int y...

    最短路径
  • 简单dfs和bfs

    简单dfs和bfs 主要为如何做标记及递归处理 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950...

    简单dfs和bfs
  • 快速排序

    快速排序(Quick Sort) 主要事如何划分再排序,使用递归方法,即创建两个函数,一个划分,一个排序。划分伪代码:123456789101112i = lowx = A[low]for j=low+1 to high ...

    快速排序
  • 归并排序

    归并排序(Merge Sort) 是创建在归并操作上的一种有效的排序算法,效率为O(nlog n)(大O符号)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用...

    归并排序
  • 插入排序

    插入排序(Insert Sort) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采...

    插入排序
  • 冒泡排序

    冒泡排序(Bubble Sort) 是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是...

    冒泡排序
  • 选择排序

    选择排序 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排...

    选择排序
  • 链表基本操作

    链表基本操作 首先生成一个结构体,例如struct node{ int data; node *link;}; 1、创建单链表123456789101112131415161718192021222324252627...

    链表基本操作