使用堆栈的河内塔问题 - 它不是解决河内问题,而是移动磁盘

时间:2021-07-20 01:58:25

标签: c stack towers-of-hanoi

    //Stack Study by yoonseul at 210719

#include <stdio.h>
#include <stdbool.h>
#define SIZE 9
#define _CRT_SECURE_NO_WARNINGS

typedef struct {
    int item[SIZE];
    int top;
} Stack;

void InitStack(Stack* pstack)
{
    pstack->top = -1;
}

bool IsFull(Stack* pstack)
{
    return pstack->top == SIZE - 1;
}

bool IsEmpty(Stack* pstack)
{
        return pstack->top == -1
}

int Peek(Stack* pstack)
{
    if (IsEmpty(pstack)) {
        return -1;
    }
    return pstack->item[pstack->top];
}

void Push(Stack* pstack, int disk)
{
    if (IsFull(pstack)) {
        exit(1);
    }
    pstack->item[++(pstack->top)] = disk;
}

void Pop(Stack* pstack) {
    if (IsEmpty(pstack)) {
        exit(1);
    }
    --(pstack->top);
}

int exchange(int x);

int main()
{
    int num;
    int rod[3][SIZE];
    char from='0', to;
    int move;

    scanf("%d", &num);

    InitStack(&rod[0]);
    InitStack(&rod[1]);
    InitStack(&rod[2]);

    for (int i = 0; i < num+1; i++) {
        Push(&rod[0], i+1);
        Push(&rod[1], 0);
        Push(&rod[2], 0);
    }

    while (from != 'q') {
        printf("%3c %3c %3c\n", 'A', 'B', 'C');
        for (int i = 0;i<num; i++) {
            printf("%3d %3d %3d\n", rod[0][i], rod[1][i], rod[2][i]);
        }


        scanf("%c %c", &from, &to);

        if (from == 'q')
            return 0;
        
        int peekF, peekT;
        int numF = exchange(from);
        int numT = exchange(to);
        
        peekF = Peek(&rod[numF]);
        peekT = Peek(&rod[numT]);

        if (peekF > peekT && peekT != -1) {
            printf("Invalid Move");
        }

        else {
            Pop(&rod[numF]);
            Push(&rod[numT],peekF);
        }

        
    }
}

int exchange(int x)
{
    switch (x) {
        case 'A':
            return 0;
        case 'B':
            return 1;
        case 'C':
            return 2;
    }
}

这是河内问题的完整代码。
目标是制作一个可以在杆之间移动它的问题,如果移动无效,则打印“无效移动”。另外,用户可以输入磁盘的数量。
我调试的时候,出现了两个错误。
一个在“A B C”下面,最后一个数字盘被打印三遍。我的目标是打印“1 0 0”
(例如,如果最大磁盘为 3,则打印 '3 3 3'。)
编辑我解决了第一个。

for (int i = 0; i < num + 1; i++) {
        Push(&rod[0], i+1);
    }
    for (int i = 0; i < num + 1; i++) {
        Push(&rod[1], 0);
    }
    for (int i = 0; i < num + 1; i++) {
        Push(&rod[2], 0);
    }

我更改了磁盘放置部分,例如使用 for 语句三次。但我不知道发生这种情况的原因。 已编辑
河内塔在第二次扫描后打印两次。我想知道发生这种情况的原因。好像是内存问题。我想知道为什么。我是编码新手。 LZ帮帮我。我在哭。

0 个答案:

没有答案