吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3529|回复: 2
收起左侧

[C&C++ 转载] 老师说要求不用递归实现汉诺塔,没啥技术含量就是堆栈模拟递归

[复制链接]
SeriousSnow 发表于 2017-5-27 09:26
本帖最后由 wjdxs1 于 2017-5-27 09:31 编辑

咱英文很差,所以那些个变量命名 都是看心情的 感觉这个英文好像有点会就英文了,不会就拼音了,,,,,

[C] 纯文本查看 复制代码
#include <stdio.h>
#include <math.h>
#include <malloc.h>

typedef struct MyStruct
{
        int i;
        char A;
        char B;
        char C;
}cs, *Pcs;

void mov(int i, char A, char B, char C);
void mov_stack(int i, char A, char B, char C);

int main()
{
        int cou = 0;
        printf_s("Please Input a number:");
        scanf_s("%d", &cou);
        printf_s("递归:\n");
        mov(cou, 'A', 'B', 'C');
        printf_s("stack:\n");
        mov_stack(cou, 'A', 'B', 'C');
        return 0;
}

void mov(int i, char A, char B, char C)
{
        if (i == 1)
                printf_s("%c->%c\n", A, C);
        else
        {
                mov(i - 1, A, C, B);
                printf_s("%c->%c\n", A, C);
                mov(i - 1, B, A, C);
        }
}

void mov_stack(int n, char A, char B, char C)
{
        int sum = (int)pow(2.0, (double)n);
        // 计算次数 (-1没减) 
        Pcs stack = (Pcs)malloc(sizeof(cs) * sum);
        //分配堆栈空间
        int index = 0;
        //堆栈初始化
        stack[index].i = n;
        stack[index].A = A;
        stack[index].B = B;
        stack[index].C = C;
        index++;
        //push
        while (index)
        {
                if (stack[index - 1].i > 1)
                {
                        stack[index].i = stack[index - 1].i - 1;
                        stack[index].A = stack[index - 1].A;
                        stack[index].B = stack[index - 1].C;
                        stack[index].C = stack[index - 1].B;
                        index++;
                        //if(i>1) push
                }
                else
                {
                        printf_s("%c->%c\n", stack[index - 1].A, stack[index - 1].C);
                        //if(i==1) show
                        index--;
                        //pop
                        if (!index)
                                break;
                        if (stack[index - 1].i == stack[index - 2].i)// 是否为第二个
                        {
                                while (index && stack[index - 1].i == stack[index - 2].i)//pop
                                        index -= 2;
                                if (!index)
                                        break;
                        }

                        printf_s("%c->%c\n", stack[index - 1].A, stack[index - 1].C);
                        //show  两个函数之间的那句
                        
                        stack[index].i = stack[index - 1].i;
                        stack[index].A = stack[index - 1].B;
                        stack[index].B = stack[index - 1].C;
                        stack[index].C = stack[index - 1].A;
                        index++;
                        /*
                        push
                        因为
                        A B C
                        B A C
                        所以
                        A C B
                        B C A
                        */
                }
        }}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

大萌黑 发表于 2017-5-27 17:36
围观,好像挺6的
plaodj 发表于 2017-5-27 19:02
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-14 20:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表