汉诺塔和N皇后问题

本文探讨了计算机科学中的两个经典递归算法问题——汉诺塔和N皇后。通过实例解析了汉诺塔问题的解决步骤,并提供了递归实现的源代码。接着介绍了8皇后问题,阐述了利用递归解决该问题的基本思路,并给出了核心代码。文章最后指出,N皇后问题同样适用深度优先搜索策略。
摘要由CSDN通过智能技术生成

汉诺塔和N皇后问题算是计算机中经典的递归算法问题了。几乎讲到递归的时候都会想到这两个问题,那么我们就来看一下这两个经典的递归问题:

首先来看一下汉诺塔问题,汉诺塔源于一个古老的印度传说:
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
当然我们不是来听故事的,我们将这个描述构造成计算机问题:
有三根柱子,这里编号为 A 、 B 、 C,一开始在A柱子上有从下往上按照从大到小顺序摆放的64个圆盘,给的任务是将这些圆盘以同样的大小顺序摆放到C柱子上,可以借助任何柱子作为中转,但是限制条件是:
1.在小圆盘上不能放大圆盘。
2.在三根柱子之间一回只能移动一个圆盘。
3.只能移动在最顶端的圆盘。

怎么解决呢?我们先假定A柱子上面的圆盘个数为2个,这里为了方便表述将圆盘编号为a、b(a圆盘在上面,b圆盘在下面),那么就先将a从A柱子移动到B柱子上面,再将b从A柱子移动到C柱子上面,再将a从B柱子移动到C柱子上面,这样就完成了,总共移动了3次圆盘。
接下来假定圆盘数为3个(编号为a、b、c),我们继续,移动步骤如下:

a(A)—> C // A柱子上的圆盘a从A柱子移动到C柱子,下同
b(A)—> B
a(C)—> B
c(A)—> C

上面是第一轮,接下来是第二轮:

a(B)—> A
b(B)—> C
a(A)—> C

我们观察:当A柱子或者B柱子只剩下一个圆盘的时候,就直接将这个圆盘移动到C柱子,上面步骤的第一轮就是先将A柱子上面的n-1(假设A柱子一共有n个圆盘)个圆盘借助其它柱子按照同样的大小顺序移动到B柱子(第一轮)这样B柱子上面就有n-1个圆盘,然后将A柱子上面的最后一个最大的圆盘直接移动到C柱子上面,接下来是将B柱子上面的n-1个圆盘借助其它柱子按照同样的大小顺序移动到C柱子上面(第二轮)。之后重复这两轮操作,直到圆盘全部转移到C柱子上。

下面直接给出源程序:



#include <iostream>
using namespace std;
int n; // 总的圆盘数
int sum; // 移动的总次数

void hanoi(int n, char A, char B, char C) // 将A柱子上面的圆盘移动到C柱子
{
    if(n == 1) //如果A柱子上面只有一个柱子,那么直接移动
    {
        cout << 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值