P1001 来源:洛谷

题目内容:

题目背景

本题是洛谷的试机题目,可以帮助了解洛谷的使用。

建议完成本题目后继续尝试P1001P1008

题目描述

超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。

                ********
               ************
               ####....#.
             #..###.....##....
             ###.......######              ###            ###
                ...........               #...#          #...#
               ##*#######                 #.#.#          #.#.#
            ####*******######             #.#.#          #.#.#
           ...#***.****.*###....          #...#          #...#
           ....**********##.....           ###            ###
           ....****    *****....
             ####        ####
           ######        ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
##########################################    #----------#
#.....#......##.....#......##.....#......#    #----------#
##########################################    #----------#
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
##########################################    ############

输入格式

输出格式

如描述

输入输出样例

 

 

解析:

题目要求输出一个画面,我们可以直接考虑使用cout/printf来解决

C

答案一:

#include<stdio.h>
int main()
{
 printf("                ********\n");
 printf("               ************\n");
 printf("               ####....#.\n");
 printf("             #..###.....##....\n");
 printf("             ###.......######              ###            ###\n");
 printf("                ...........               #...#          #...#\n");
 printf("               ##*#######                 #.#.#          #.#.#\n");
 printf("            ####*******######             #.#.#          #.#.#\n");
 printf("           ...#***.****.*###....          #...#          #...#\n");
 printf("           ....**********##.....           ###            ###\n");
 printf("           ....****    *****....\n");
 printf("             ####        ####\n");
 printf("           ######        ######\n");
 printf("##############################################################\n");
 printf("#...#......#.##...#......#.##...#......#.##------------------#\n");
 printf("###########################################------------------#\n");
 printf("#..#....#....##..#....#....##..#....#....#####################\n");
 printf("##########################################    #----------#\n");
 printf("#.....#......##.....#......##.....#......#    #----------#\n");
 printf("##########################################    #----------#\n");
 printf("#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n");
 printf("##########################################    ############\n");
 return 0; 
} 

该题解使用了printf以输出多行文字,虽然也能输出成功,但这样显得有些麻烦,所以该怎么做呢

答案二:

#include<stdio.h>
int main() {
    printf(
    "                ********\n"
    "               ************\n"
    "               ####....#.\n"
    "             #..###.....##....\n"
    "             ###.......######              ###            ###\n"
    "                ...........               #...#          #...#\n"
    "               ##*#######                 #.#.#          #.#.#\n"
    "            ####*******######             #.#.#          #.#.#\n"
    "           ...#***.****.*###....          #...#          #...#\n"
    "           ....**********##.....           ###            ###\n"
    "           ....****    *****....\n"
    "             ####        ####\n"
    "           ######        ######\n"
    "##############################################################\n"
    "#...#......#.##...#......#.##...#......#.##------------------#\n"
    "###########################################------------------#\n"
    "#..#....#....##..#....#....##..#....#....#####################\n"
    "##########################################    #----------#\n"
    "#.....#......##.....#......##.....#......#    #----------#\n"
    "##########################################    #----------#\n"
    "#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n"
    "##########################################    ############\n"
    );
    return 0;
}

这样就显得容易多了,但还是不够简洁,所以我们可以用C++来解决

 

C++:

答案一:

 

#include<iostream>
int main()
{
    std::cout<<"                ********\n\
               ************\n\
               ####....#.\n\
             #..###.....##....\n\
             ###.......######              ###            ###\n\
                ...........               #...#          #...#\n\
               ##*#######                 #.#.#          #.#.#\n\
            ####*******######             #.#.#          #.#.#\n\
           ...#***.****.*###....          #...#          #...#\n\
           ....**********##.....           ###            ###\n\
           ....****    *****....\n\
             ####        ####\n\
           ######        ######\n\
##############################################################\n\
#...#......#.##...#......#.##...#......#.##------------------#\n\
###########################################------------------#\n\
#..#....#....##..#....#....##..#....#....#####################\n\
##########################################    #----------#\n\
#.....#......##.....#......##.....#......#    #----------#\n\
##########################################    #----------#\n\
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n\
##########################################    ############";
}

我们可以使用C++输出换行符"\"来解决,这样就可以通过多次复制粘贴来完成了!

答案二:

 

#include<iostream>
int main()
{
    std::cout<<R"(                ********
               ************
               ####....#.
             #..###.....##....
             ###.......######              ###            ###
                ...........               #...#          #...#
               ##*#######                 #.#.#          #.#.#
            ####*******######             #.#.#          #.#.#
           ...#***.****.*###....          #...#          #...#
           ....**********##.....           ###            ###
           ....****    *****....
             ####        ####
           ######        ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
##########################################    #----------#
#.....#......##.....#......##.....#......#    #----------#
##########################################    #----------#
#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#
##########################################    ############ )";
}

 

———C++11 raw string literal 技术,让你体会复制粘贴的恐惧

这种方法可以说是完美了

 答案三:

当然,也当然有娱乐写法

 

//来自不知哪个大佬的代码
#include <bits/stdc++.h>
using namespace std;
int mp[100][100];
int last[100];
int n = 22, m = 62;
// 在[x1-x2, y1-y2]绘制ch
void draw(int x1, int y1, int x2, int y2, char ch = '#'){
    for(int i = x1; i <= x2; i++)
        for(int j = y1; j <= y2; j++)
            mp[i][j] = ch;
}
// 在[x1, y1]绘制ch
void draw(int x1, int y1, char ch = '#'){
    draw(x1, y1, x1, y1, ch);
}
// 以[x, y]为左上角绘制泥土
void drawland(int x, int y){
    draw(x, y, x+8, y+13);
    for(int i = x+1; i < x+8; i+=2)
        draw(i, y+1, i, y+12, '.');
    draw(x+1, y+4); draw(x+1, y+11);
    draw(x+3, y+3); draw(x+3, y+8);
    draw(x+5, y+6); draw(x+7, y+2);
    draw(x+7, y+5); draw(x+7, y+10);
}
// 以[x, y]为左上角绘制小岛
void drawisland(int x, int y){
    draw(x, y, x+3, y+19);
    draw(x+1, y+1, x+2, y+18, '-');
    draw(x+4, y+4, x+8, y+15);
    draw(x+4, y+5, x+7, y+14, '-');
}
// 以[x, y]为左上角绘制金币
void drawcoin(int x, int y){
    draw(x, y, x+5, y+4);
    draw(x+1, y+1, x+4, y+3, '.');
    draw(x+2, y+2, x+3, y+2);
    draw(x, y, ' '); draw(x+5, y, ' ');
    draw(x, y+4, ' '); draw(x+5, y+4, ' ');
}
// 以[x, y]为左上角绘制马里奥
void drawman(int x, int y){
    draw(x, y+5, x, y+12, '*'); x++;
    draw(x, y+4, x, y+15, '*'); x++;
    draw(x, y+4, x, y+7); draw(x, y+8, x, y+13, '.'); draw(x, y+12); x++;
    draw(x, y+2, x, y+14); draw(x, y+3, x, y+4, '.');
    draw(x, y+8, x, y+12, '.'); draw(x, y+15, x, y+18, '.'); x++;
    draw(x, y+2, x, y+17); draw(x, y+5, x, y+11, '.'); x++;
    draw(x, y+5, x, y+15, '.'); x++;
    draw(x, y+4, x, y+13); draw(x, y+6, '*'); x++;
    draw(x, y+1, x, y+17); draw(x, y+5, x, y+11, '*'); x++;
    draw(x, y, x+2, y+20, '.'); draw(x, y+4, x+2, y+16, '*');
    draw(x, y+3); draw(x, y+14, x+1, y+16); draw(x+1, y+16, '.');
    draw(x+2, y+8, x+2, y+11, ' '); draw(x, y+7, '.'); draw(x, y+12, '.');
    draw(x+3, y, x+4, y+19); draw(x+3, y+6, x+4, y+13, ' ');
    draw(x+3, y, x+3, y+1, ' '); draw(x+3, y+18, x+3, y+19, ' ');
}
// 打印输出
void printscreen(){
    for(int i = 1; i <= n; i++){
        last[i] = m;
        while(mp[i][last[i]] == ' ')
            last[i]--;
    }
    for(int i = 1; i <= n; i++,puts(""))
        for(int j = 1; j <= last[i]; j++)
            putchar(mp[i][j]);
}
int main(){
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            mp[i][j] = ' ';
    // 绘制人
    drawman(1, 12);
    // 绘制他脚下的三块泥土
    drawland(14, 1); drawland(14, 15); drawland(14, 29);
    // 绘制金币下面的那个岛屿
    drawisland(14, 43);
    // 绘制两个金币
    drawcoin(5, 43); drawcoin(5, 58);
    // 输出
    printscreen();
    return 0;
}

 

这个解法确实让我非常吃惊,也生动的诠释了——“小题大做”。

 

 

PS:部分题解来源洛谷,如有侵权请联系删除

 

上一篇:P1001


下一篇:[LeetCode] 354. Russian Doll Envelopes