超级玛丽游戏 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题要求在没有任何输入的情况下,输出超级玛丽游戏中的一个固定字符画场景。由于输出内容完全确定,核心解法是把题面给出的字符画原样保存为常量字符串并一次性打印,实现时只需保证每行的行首空格与行内空格逐字符一致。

分析
核心观察

本题没有输入,答案唯一确定,任何程序只要输出的字符与题面完全一致即可通过。字符画由空格、星号、井号、点号、减号构成,共 22 行,每行的长度与空格分布都是固定的。

思路

题目只要求输出,不涉及任何数值计算,因此没有需要推导的公式,答案本身就是题面给出的那一段字符画。可行的实现方式有 3 种:把字符画整体存入多行字符串后一次输出;逐行调用输出函数,共输出 22 次;找出字符画中重复的行与空格规律后用循环拼接生成。

第 3 种方式代码最短,但需要额外维护拼接逻辑,任何一处空格数目计算错误都会导致答案错误;第 1 种方式直接照抄题面,最不容易出错,且借助语言提供的多行字符串语法(C++ 的原始字符串字面量、Python 的三引号字符串)可以避免对换行与空格逐一转义,故采用第 1 种。

需要严格控制的地方是空格:行首空格数量与每行内部的连续空格数量都必须与题面完全一致,不能用统一的缩进或居中规则批量生成。字符画整体为 1128 字节,其中第 14 行至第 17 行每行 62 个字符,第 18 行至第 22 行每行 58 个字符,各行长度并不统一。

具体示例

以字符画中的几行为例:第 14 行是连续的 62 个井号,构成最上方的一条完整横线,长度为 62;第 5 行左侧是角色轮廓,中间是一段连续空格,右侧还有两组各 3 个井号组成的方块,整行长度为 61;第 15 行由井号、点号与减号混合构成,长度同样为 62。可见每行的空格分布各不相同,只能逐行原样复制。

算法步骤
  1. 将题面给出的字符画原样保存为字符串常量 art,共 22 行,每行末尾保留换行符,行首与行内空格保持不变。
  2. 一次性输出 art。
复杂度分析
  • 时间:O(1)。程序只执行一次固定长度的输出,输出内容为 1128 字节,与任何输入规模无关。
  • 空间:O(1)。只需要保存一份长度固定的字符画常量。
实现注意事项
  • 本题没有输入,程序不需要编写任何读入逻辑。
  • 行首空格与行内连续空格必须逐字符保留,不能交给会自动重新排版的工具处理。
  • C++ 的原始字符串要求字符画紧跟开引号书写,且结束标记必须顶格,否则会向输出中引入多余空格。
  • 字符画以换行符结尾,Python 的输出函数默认会再追加一个换行,需把结束参数设为空字符串,否则会多出 1 行空行。
  • 输出量约为 1.1 KB,远小于常见输出大小限制,不需要任何缓冲优化。
源代码
#include <iostream>
using namespace std;

int main() {
    const char art[] = R"(                ********
               ************
               ####....#.
             #..###.....##....
             ###.......######              ###            ###
                ...........               #...#          #...#
               ##*#######                 #.#.#          #.#.#
            ####*******######             #.#.#          #.#.#
           ...#***.****.*###....          #...#          #...#
           ....**********##.....           ###            ###
           ....****    *****....
             ####        ####
           ######        ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
##########################################    #----------#
#.....#......##.....#......##.....#......#    #----------#
##########################################    #----------#
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
##########################################    ############
)";
    cout << art;
    return 0;
}
art = """                ********
               ************
               ####....#.
             #..###.....##....
             ###.......######              ###            ###
                ...........               #...#          #...#
               ##*#######                 #.#.#          #.#.#
            ####*******######             #.#.#          #.#.#
           ...#***.****.*###....          #...#          #...#
           ....**********##.....           ###            ###
           ....****    *****....
             ####        ####
           ######        ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
##########################################    #----------#
#.....#......##.....#......##.....#......#    #----------#
##########################################    #----------#
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
##########################################    ############
"""
print(art, end="")

评论

目前没有评论。