汉诺塔算法c++出现错误

问题描述

汉诺塔算法c++出现错误

#include

using namespace std;

//圆盘的个数最多为64
const int MAX = 64;

//用来表示每根柱子的信息
struct st{
int s[MAX]; //柱子上的圆盘存储情况
int top; //栈顶,用来最上面的圆盘
char name; //柱子的名字,可以是A,B,C中的一个

int Top()    //取栈顶元素
{
    return s[top];
}

int Pop()    //出栈
{
 return s[top--];
}

void Push(int x)    //入栈
{
 s[++top] = x;
}

} ;

long Pow(int x, int y); //计算x^y

void Creat(st ta[], int n); //给结构数组设置初值

void Hannuota(st ta[], long max); //移动汉诺塔的主要函数

int main(void)
{
int n;

cin >> n; //输入圆盘的个数
st ta[3]; //三根柱子的信息用结构数组存储
Creat(ta, n); //给结构数组设置初值
long max = Pow(2, n) - 1; //动的次数应等于2^n - 1
Hannuota(ta, max); //移动汉诺塔的主要函数
system("pause");
return 0;
}

void Creat(st ta[], int n)
{
ta[0].name = 'A';
ta[0].top = n-1;

//把所有的圆盘按从大到小的顺序放在柱子A上
for (int i=0; i<n; i++)
    ta[0].s[i] = n - i;

//柱子B,C上开始没有没有圆盘
ta[1].top = ta[2].top = 0;

for (int i=0; i<n; i++)
    ta[1].s[i] = ta[2].s[i] = 0;

//若n为偶数,按顺时针方向依次摆放 A B C
if ( n%2 == 0)
{
    ta[1].name = 'B';
 ta[2].name = 'C';
}
else //若n为奇数,按顺时针方向依次摆放 A C B
{
    ta[1].name = 'C';
 ta[2].name = 'B';
}

}

long Pow(int x, int y)
{
long sum = 1;

for (int i = 0; i < y; i++)
    sum *= x; 

return sum;

}

void Hannuota(st ta[], long max)
{
int k = 0; //累计移动的次数
int i = 0;
int ch;

  while (k < max)
  {
    //按顺时针方向把圆盘1从现在的柱子移动到下一根柱子
    ch = ta[i%3].Pop();

     ta[(i+1)%3].Push(ch);

       cout << ++k << ": " << "Move disk " << ch << " from "
       << ta[i%3].name <<" to " << ta[(i+1)%3].name << endl;

       i++;

       //把另外两根柱子上可以移动的圆盘移动到新的柱子上
       if (k < max)
       {
        //把非空柱子上的圆盘移动到空柱子上,当两根柱子都为空时,移动较小的圆盘
        if (ta[(i+1)%3].Top() == 0 || ta[(i-1)%3].Top() > 0
            && ta[(i+1)%3].Top() > ta[(i-1)%3].Top())
        {
            ch = ta[(i-1)%3].Pop();
            ta[(i+1)%3].Push(ch);
            cout << ++k << ": " << "Move disk " << ch << " from "
            << ta[(i-1)%3].name << " to " << ta[(i+1)%3].name << endl;
        }
        else
     {
               ch = ta[(i+1)%3].Pop();
               ta[(i-1)%3].Push(ch);
               cout << ++k << ": " << "Move disk " << ch << " from "
               << ta[(i+1)%3].name << " to " << ta[(i-1)%3].name << endl;
        }
     }
}

}

vc6.0运行有错误啊

解决方案

参考:http://zhidao.baidu.com/link?url=GHTubFm65jJjwYsWyfr7T-FdcPk_y6YSeENLKxOSwMp8Yf1KkDMSGrQUXc9hbSQfIjBBdDi659Z2GzNSge6ZGq

解决方案二:

我记得这个有大学书上有实例的
没这么复杂样

解决方案三:

#include

void han(int num, char ch1, char ch2, char ch3)
{

if (num == 1)
{

printf("盘子%d从柱子%c移动到柱子%cn", 1, ch1, ch3);

return ;

}

han(num - 1, ch1, ch3, ch2);

printf("盘子%d从柱子%c移动到柱子%cn", num, ch1, ch3);

han(num - 1, ch2, ch1, ch3);

}

int main()
{

han(3, 'a', 'b', 'c'); 

return 0;

}

时间: 2024-10-03 05:46:02

汉诺塔算法c++出现错误的相关文章

C++实现汉诺塔算法经典实例_C 语言

本文所述为汉诺塔算法的C++代码的经典实现方法. 汉诺塔问题描述:3个柱为a.b.c,圆盘最初在a柱,借助b柱移到c柱.需要你指定圆盘数. 具体实现代码如下: #include <iostream> using namespace std; int times = 0; //全局变量,搬动次数 //第n个圆盘从x柱搬到z柱 void move(int n, char x, char z) { cout << "第" << ++times <&l

Go语言实现汉诺塔算法_Golang

hano.go package main import ( "bufio" "fmt" "os" "strconv" ) func main() { fmt.Print("输入要移动的盘子数:") reader := bufio.NewReader(os.Stdin) lool: data, _, _ := reader.ReadLine() n, err := strconv.Atoi(string(da

C语言递归实现汉诺塔算法

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1) 直接将A柱子上的圆盘从A移动到C else 先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上 直接将A柱子上的第n个圆盘移动到C柱子上 最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 操作系统:ubuntu 编译软件:gcc 结果截

VC++实现模拟汉诺塔效果_C 语言

先上效果图 再附上源代码: 汉诺塔: 复制代码 代码如下: #include "stdio.h" #include "math.h" int arrA[15], arrB[15], arrC[15];   // 分别为A.B.C int length; int lenA, lenB, lenC; char plate[32]; // Make void makeplate(int n) {     int i;     if (n == length + 1)   

多柱汉诺塔最优算法设计探究

多柱汉诺塔最优算法设计探究   引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因此多柱汉诺塔的柱子个数M≥3.下面从三柱汉诺塔说起,慢慢深入我们要关心的问题. 1. 三柱汉诺塔 三柱汉诺塔是经典的汉诺塔问题,在算法设计中是递归算法的典型问题.其算法是这样的: 首先把A 柱上面的n- 1 个碟子通过C 柱移到B 柱上[T(n-1)步],然后把A 柱剩下的一个碟子移到C 柱上[1步], 最后把B 柱上所有

递归解决汉诺塔问题

前言:汉诺塔问题是源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在第三根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 我们用递归算法来解决这个问题,在解决之前首先介绍一下什么是递归算法. 1.递归算法 在解决一些复杂问题时,为了降低问题的复杂程序,通常是将问题逐层分解,最后归结为一些最简单的问题.这种将问题逐层分解的过程,并没有对问题进行求解,而

c语言算法-求大神关于4个塔座的汉诺塔问题,怎么用C语言算法解决

问题描述 求大神关于4个塔座的汉诺塔问题,怎么用C语言算法解决 .设a,b,c,d是4个塔座.开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起.各圆盘从小到大编号为1,2,3,...n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍然按同样顺序重叠.在移动圆盘时应该遵守以下移动规则. 规则1,每次只能移动1个圆盘: 规则2,任何时刻都不允许将较大的圆盘压在较小的圆盘之上: 规则3,在满足移动规则1和规则2的前提下,可将圆盘移至a,b,c,d任一塔座上. 解决方案 经典算法

算法-汉诺塔是怎么思考出来的

问题描述 汉诺塔是怎么思考出来的 本人菜鸟,看到这个算法的时候觉得好巧妙,但是自己怎么也想不出来啊... 解决方案 所谓递归,其实人类是做不到的,因为递归嵌套多了,人就乱了,有点像是盗梦空间里的深层梦境limbo,到那就几乎回不到现实了. 但是计算机不像人类想法那么多,尤其是基于过程的设计,你教我怎么走我就怎么走,不会混乱,但是你得给我定个边界条件,要不我还是回不来. 汉诺塔的确是一个经典的递归问题,而人类做的最伟大的一步在于,把f(n)的问题转化为f(n-1),推本溯源,总要找到一个origi

Java数据结构及算法实例:汉诺塔问题 Hanoi_java

/** * 汉诺塔大学的时候就学过,但是根本没搞明白,唯一知道的就是要用递归的方法来求解. * 问题描述: * 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小. * 要求按下列规则将所有圆盘移至C杆: * 1.每次只能移动一个圆盘: * 2.大盘不能叠在小盘上面. * 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆, * 但都必须尊循上述两条规则. * 问:如何移?最少要移动多少次? * 解决方法: * 假设只有2个盘子,柱子分别是A, B, C柱