题目内容:
题目背景
本题是洛谷的试机题目,可以帮助了解洛谷的使用。
题目描述
超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。
********
************
####....#.
#..###.....##....
###.......###### ### ###
........... #...# #...#
##*####### #.#.# #.#.#
####*******###### #.#.# #.#.#
...#***.****.*###.... #...# #...#
....**********##..... ### ###
....**** *****....
#### ####
###### ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############
输入格式
无
输出格式
如描述
输入输出样例
无
解析:
题目要求输出一个画面,我们可以直接考虑使用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:部分题解来源洛谷,如有侵权请联系删除