c语言 汉诺塔算法代码

yizhihongxing

汉诺塔算法代码攻略

什么是汉诺塔游戏?

汉诺塔是一种数学智力题,也是一个益智游戏。游戏中有三根柱子,中间的一根柱子固定不动,左边的柱子上有64枚盘子,呈金字塔形摆放,盘子大小不同,大的在下,小的在上。现在的任务是,将这64个盘子慢慢从左边的柱子上移到右边的柱子上。

算法实现思路

汉诺塔游戏大致思路为:将n-1个盘子从左边的柱子经由中间的柱子移到右边的柱子上,再将底部的最后一个盘子从左边的柱子移到右边的柱子上,最后将n-1个盘子从中间的柱子移到左边的柱子上。

我们可以利用递归算法来实现汉诺塔游戏。递归算法通常需要满足以下三个条件:

  1. 基准情况:这是递归调用结束的条件。
  2. 需要使用递归调用自身的情况。
  3. 每次递归需要移动步骤相同,但是盘子编号不同的三个柱子。

在实现过程中,我们可以使用C语言来编写代码。

代码示例1

下面是使用C语言编写的汉诺塔游戏示例代码:

#include <stdio.h>

void move(int n, char a, char b, char c)
{
    if (n == 1)
    {
        printf("Move disk 1 from %c to %c\n", a, c);
    }
    else
    {
        move(n-1, a, c, b);
        printf("Move disk %d from %c to %c\n", n, a, c);
        move(n-1, b, a, c);
    }
}

int main()
{
    int n;
    printf("Please input the number of disks: ");
    scanf("%d", &n);
    move(n, 'A', 'B', 'C');
    return 0;
}

代码中包含了递归函数move和主函数main。其中move函数用来完成移动盘子的操作,main函数则用来启动汉诺塔游戏,并获取游戏的盘子数量输入。

代码示例2

我们还可以使用非递归算法,通过栈的数据结构来实现汉诺塔游戏。下面是使用C语言编写的汉诺塔游戏示例代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int plate;
    char from;
    char to;
    char via;
}Step;

typedef struct{
    Step * content;
    int top;
    int max;
}Stack;

Stack * MakeStack(int max){
    Stack * s = (Stack *)malloc(sizeof(Stack));
    s->content = (Step *)malloc(sizeof(Step)*max);
    s->max = max;
    s->top = -1;
    return s;
}

void Push(Stack * s, Step c){
    if(s->top < s->max){
       s->top ++;
       s->content[s->top] = c;
    }
}

Step Pop(Stack * s){
    if(s->top >= 0){
        Step c = s->content[s->top];
        s->top--;
        return c;
    }
}

void Hanoi(int n){
    Stack * S = MakeStack(100);
    Push(S, (Step){n, 'A', 'C', 'B'});
    while(S->top >= 0){
        Step s = Pop(S);
        n = s.plate;
        if(n == 1) printf("Move disk 1 from %c to %c\n", s.from, s.to);
        else{
            Push(S, (Step){n-1, s.from, s.via, s.to});
            Push(S, (Step){1, s.from, s.to, s.via});
            Push(S, (Step){n-1, s.via, s.to, s.from});
        }
    }
}

int main(){
    int n;
    printf("Please input the number of disks: ");
    scanf("%d", &n);
    Hanoi(n);
    return 0;
}

代码中使用了两个结构体,一个是Step结构体用来保存移动盘子的起始位置,目标位置和缓冲位置,另一个是Stack结构体用来实现栈的数据结构,以完成非递归的汉诺塔游戏。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c语言 汉诺塔算法代码 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Jquery通过JSON字符串创建JSON对象

    当使用jQuery进行Ajax请求时,响应得到的数据通常是一个JSON字符串,为了使获得的JSON数据更易于操作,需要将其转化为JSON对象。下面是实现此过程的完整攻略: 1. 使用parseJSON方法 parseJSON方法可以将JSON字符串转化为JSON对象。 var jsonStr = ‘{"name":"Emma&q…

    C 2023年5月23日
    00
  • jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)

    下面是关于“jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)”的完整攻略: 1. 前言 首先,这里需要明确一点,这篇攻略介绍的是如何使用jQuery自定义图片缩放拖拽插件imageQ。如果你还不了解什么是jQuery,请先学习一下基础知识。 该插件可用于任何需要在网页中实现图片缩放和拖拽的场景,例如放大镜、海报展示、照片墙等。 2…

    C 2023年5月23日
    00
  • Ubutu1604安装colmap实现方法详细教程

    Ubuntu 16.04 安装 COLMAP 实现方法详细教程 COLMAP 是一种基于图像的三维重建和显著点提取工具。在 Linux 下,你可以按照以下步骤来安装 COLMAP。 步骤 1:安装依赖项 在安装 COLMAP 之前,请确保你已经安装了以下依赖项: sudo apt-get update sudo apt-get install python-…

    C 2023年5月23日
    00
  • C语言 strcat()函数

    当我们需要将两个字符串连接在一起时,可以使用C语言中的strcat()函数。它可以把两个字符串拼接起来,并返回结果字符串的地址。 函数原型 char *strcat(char *dest, const char *src); 该函数有两个参数: dest:需要被追加的目标字符串。 src:需要追加的源字符串。 函数返回值是一个指向目标字符串的指针。需要注意的…

    C 2023年5月9日
    00
  • C语言源码实现停车场管理系统

    C语言源码实现停车场管理系统 介绍 停车场管理系统是一个常见的管理系统,可用于实现停车场入场、出场的车辆管理及计费功能。这个系统可以通过编程语言实现。C语言是一门广泛应用于工业界、应用界和学术界的计算机编程语言,在实现停车场管理系统方面也有良好的表现。 实现步骤 下面是一个简单的实现停车场管理系统的步骤: 1. 创建一个车辆结构体 创建一个车辆结构体并在其中…

    C 2023年5月30日
    00
  • C语言实现飞机大战程序设计

    C语言实现飞机大战程序设计攻略 本文将介绍如何使用C语言编写一个基于控制台的飞机大战游戏。该游戏将在控制台内实现,通过键盘控制飞机移动与发射子弹,实现与敌机的战斗。 准备工作:学习C语言的基础知识 在开始编写游戏前,需要掌握一些基本的C语言知识,包括语法、变量、函数等。如果你是初学者,可以先通过一些C语言的教程、书籍或视频学习基础知识。 第一步:绘制游戏画面…

    C 2023年5月23日
    00
  • C++如何实现BCD码和ASCII码的相互转换

    BCD码是一种二进制编码方式,用来表示十进制数字。在每一个字节中,四位二进制数能够表示一个十进制位的数字。ASCII码则是一种字符编码方式,将每个字符映射为一个唯一的数字。 在C++中,将BCD码转换为ASCII码的一般方法是,将BCD码中的每个数字转换为对应的ASCII码数字。而将ASCII码转换为BCD码的一般方法是,将ASCII码中的每个数字转换为对应…

    C 2023年5月23日
    00
  • Java日常练习题,每天进步一点点(28)

    题目:给定两个字符串,找到这两个字符串中最长的公共连续子字符串。 示例1: 输入: str1 = “ABCD” ,str2 = “CBCE”输出: “BC” 示例2: 输入: str1 = “ABC” ,str2 = “DEF”输出: “” 分析:题目要求找到两个字符串的最长公共连续子字符串,我们可以通过动态规划算法来解决此类问题。具体思路是,定义一个二维数…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部