C++ 实现汉诺塔问题:带名字的塔和积木

连一刻也没有为分解数问题的解决庆祝,立刻赶到 OJ的是一递归·汉诺塔问题

有三个平台,分别代号为 A,B,C,有 N 个积木,初始时全部放在平台 A 上,从下到上搭成一个塔。

现在要求你将 A 平台上的全部积木,移动到 B 塔上,但要求在移动过程中,每次只能将一个平台最项端的积木移动到另一个平台的最顶端的积木上方(如果目标平台没有积木,就直接移动)。在任何一次移动之后,需要保证若积木 X 恰好压在积木 Y 上方,则在第一次移动前,积木 X 在积木 Y 的上方(可以间隔有其他积木)。

请以最少的移动次数,完成要求,每次移动,输出移动的积木名称,来源平台的名称和目标平台的名称

句话题意: 塔和积木都有名字的汉诺塔

汉诺塔是什么? 第一周 OT 睡着了吗?

输入格式

第一行一个整数 n,表示 A 平台上的积木数

接下来三行,每行一个字符串 S1,分别表示 A,B,C 三个平台的名字

接下来 n 行,每行一个字符串 S2,分别表示初始时 A 平台从底至顶的 n 个积木的名字

1 <= n <= 10: 1 <= 绝对值 S <= 20:

输入保证 S 由英文字母、数字、英文半角空格和下划线组成,不包含该行末尾的 '\n' 换行符

输出格式

若干行,行数为最少的移动次数;

每行一个字符串,表示移动操作;

我们用 a,b,x 分别表示该次移动的初始平台,目标平台和移动的积木,则应当输出 'Move Sx from Sa to Sb .' 不含引号,Sa,Sb,Sx 分别表示初始平台的名字,目标平台的名字和积木的名字,名字不包含换行符,但如果其内部有空格,则包含其内部的空格。

#include <iostream>
#include <vector>
#include <string>

void moveDisk(int n, std::string source, std::string dest, std::string aux, std::vector<std::string>& moves) {
    if (n == 1) {
        moves.push_back("Move ' + source + ' to ' + dest + ".");
        return;
    }

    moveDisk(n - 1, source, aux, dest, moves);
    moves.push_back("Move ' + source + ' to ' + dest + ".");
    moveDisk(n - 1, aux, dest, source, moves);
}

int main() {
    int n;
    std::cin >> n;

    std::string A, B, C;
    std::cin >> A >> B >> C;

    std::vector<std::string> blocks(n);
    for (int i = 0; i < n; i++) {
        std::cin >> blocks[i];
    }

    std::vector<std::string> moves;
    moveDisk(n, A, B, C, moves);

    for (const std::string& move : moves) {
        std::cout << move << std::endl;
    }

    return 0;
}

示例输入:

3
A
B
C
Block1
Block2
Block3

示例输出:

Move Block1 from A to B.
Move Block2 from A to C.
Move Block1 from B to C.
Move Block3 from A to B.
Move Block1 from C to A.
Move Block2 from C to B.
Move Block1 from A to B.
C++ 实现汉诺塔问题:带名字的塔和积木

原文地址: https://www.cveoy.top/t/topic/ZGy 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录