ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC201605 Bits

2022-06-23 01:00:08  阅读:151  来源: 互联网

标签:... .. 输出 .... ................... ..... NC201605 Bits


NC201605 Bits

题目

题目描述

Nancy喜欢做游戏!
汉诺塔是一个神奇的游戏,神奇在哪里呢?

给出 \(3\) 根柱子,最开始时 \(n\) 个盘子按照大小被置于最左的柱子。

如果盘子数为偶数,则需要将她们全部移动到最右侧的柱子上,否则将她们移动到中间的柱子上。

那么,Nancy该怎样移动呢?请你输出汉诺塔游戏的过程叭!

输入描述

共一行:一个整数 \(n\) ,表示最开始 \(n\) 个盘子(编号为 \(1\) 到 \(n\) )的放置方法。

数据满足:\(2 \leq n \leq 11\)。

输出描述

共 \(2^n\) 组:每组 \(n+2\) 行,每行 \(3 \times (2n+1)+4\) 个字符,用.表示空白区域,用|表示柱子区域,用*表示盘子。组与组之间请输出 \(3 \times (2n+1)+4\) 个-。
具体输出方式请参看样例进行理解。

示例1

输入

2

输出

...................
...|.....|.....|...
..***....|.....|...
.*****...|.....|...
-------------------
...................
...|.....|.....|...
...|.....|.....|...
.*****..***....|...
-------------------
...................
...|.....|.....|...
...|.....|.....|...
...|....***..*****.
-------------------
...................
...|.....|.....|...
...|.....|....***..
...|.....|...*****.

题解

思路

知识点:递归。

难点在输出。用 \(0,1,2\) 表示三个塔,用向量模拟塔的圆盘情况,采用后进先出的的操作。再用一个函数输出当前状态即可。

时间复杂度 \(O(2^n)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int N, cnt;
vector<int> h[3];

void write() {
    for (int i = 1;i <= 3 * (2 * N + 1) + 4;i++) cout << '.';
    cout << '\n';
    for (int i = 1;i <= 3 * (2 * N + 1) + 4;i++) {
        if (i == N + 2 || i == 3 * N + 4 || i == 5 * N + 6) cout << '|';
        else cout << '.';
    }
    cout << '\n';
    for (int i = N - 1;i >= 0;i--) {
        for (int j = 1;j <= 3 * (2 * N + 1) + 4;j++) {
            if (i < h[0].size() && h[0][i] && N + 2 - h[0][i] <= j && j <= N + 2 + h[0][i] ||
                i < h[1].size() && h[1][i] && 3 * N + 4 - h[1][i] <= j && j <= 3 * N + 4 + h[1][i] ||
                i < h[2].size() && h[2][i] && 5 * N + 6 - h[2][i] <= j && j <= 5 * N + 6 + h[2][i]
                ) cout << '*';
            else if (j == N + 2 || j == 3 * N + 4 || j == 5 * N + 6) cout << '|';
            else cout << '.';
        }
        cout << '\n';
    }
}

void hanoi(int n, int A, int B, int C) {
    if (n == 1) {
        for (int i = 1;i <= 3 * (2 * N + 1) + 4;i++) cout << '-';
        cout << '\n';
        cnt++;
        h[C].push_back(h[A].back());
        h[A].pop_back();
        write();
        return;
    }
    hanoi(n - 1, A, C, B);
    cnt++;
    h[C].push_back(h[A].back());
    h[A].pop_back();
    for (int i = 1;i <= 3 * (2 * N + 1) + 4;i++) cout << '-';
    cout << '\n';
    write();
    hanoi(n - 1, B, A, C);
}

int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> N;
    for (int i = N;i >= 1;i--) h[0].push_back(i);
    write();
    if (N & 1) hanoi(N, 0, 2, 1);
    else hanoi(N, 0, 1, 2);
    return 0;
}

标签:...,..,输出,....,...................,.....,NC201605,Bits
来源: https://www.cnblogs.com/BlankYang/p/16403790.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有