难度分类:入门
题目描述
超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。
********
************
####....#.
#..###.....##....
###.......###### ### ###
........... #...# #...#
##*####### #.#.# #.#.#
####*******###### #.#.# #.#.#
...#***.****.*###.... #...# #...#
....**********##..... ### ###
....**** *****....
#### ####
###### ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############
输入格式
无
输出格式
如描述
输入输出样例
无
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
思路(?)
考察打印函数cout or printf的用法
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout << " ********\n";
cout << " ************\n";
cout << " ####....#.\n";
cout << " #..###.....##....\n";
cout << " ###.......###### ### ###\n";
cout << " ........... #...# #...#\n";
cout << " ##*####### #.#.# #.#.#\n";
cout << " ####*******###### #.#.# #.#.#\n";
cout << " ...#***.****.*###.... #...# #...#\n";
cout << " ....**********##..... ### ###\n";
cout << " ....**** *****....\n";
cout << " #### ####\n";
cout << " ###### ######\n";
cout << "##############################################################\n";
cout << "#...#......#.##...#......#.##...#......#.##------------------#\n";
cout << "###########################################------------------#\n";
cout << "#..#....#....##..#....#....##..#....#....#####################\n";
cout << "########################################## #----------#\n";
cout << "#.....#......##.....#......##.....#......# #----------#\n";
cout << "########################################## #----------#\n";
cout << "#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n";
cout << "########################################## ############\n";
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
思考:如何打印m倍大小的超级玛丽?
(受SDUT擂台赛打印EDGNB题目的启发,搞一个打印m倍的马里奥hhhh, 友链SDUT OnlineJudge)
//打印m倍→每行图形个数*m, 每行图形出现m行,如m = 2 效果如下图所示
思路:
step1:分行构建出m = 1(即最初始状态)的马里奥代码,将每一行每一种符号(' ', '-', ' ', '*', '.')分别用打印函数(自定义print函数,参数为打印符号的数量,打印符号的类型,以及m倍数)表示出来(如print(13, '*', m))
step2:使用循环控制图形m倍的每一行与m行的打印(一行内变为m倍,每行循环m次)
代码:
#include <bits/stdc++.h>
using namespace std;
void print(int n, char c, int m)
{
switch (c)
{
case' ':
for (int i = 1; i <= n * m; i++) cout << ' ';
break;
case'*':
for (int i = 1; i <= n * m; i++) cout << '*';
break;
case'#':
for (int i = 1; i <= n * m; i++) cout << '#';
break;
case'.':
for (int i = 1; i <= n * m; i++) cout << '.';
break;
default:
for (int i = 1; i <= n * m; i++) cout << '-';
}
}
void printm(int m)
{
for (int i = 1; i <= m; i++)
{
print(16, ' ', m);//第一行
print(8, '*', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(15, ' ', m);//第二行
print(12, '*', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(15, ' ', m);//第三行
print(4, '#', m);
print(4, '.', m);
print(1, '#', m);
print(1, '.', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(13, ' ', m);//第四行
print(1, '#', m);
print(2, '.', m);
print(3, '#', m);
print(5, '.', m);
print(2, '#', m);
print(4, '.', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(13, ' ', m); //第五行
print(3, '#', m);
print(7, '.', m);
print(6, '#', m);
print(14, ' ', m);
print(3, '#', m);
print(12, ' ', m);
print(3, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(16, ' ', m);//第六行
print(11, '.', m);
print(15, ' ', m);
print(1, '#', m);
print(3, '.', m);
print(1, '#', m);
print(10, ' ', m);
print(1, '#', m);
print(3, '.', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(15, ' ', m);//第七行
print(2, '#', m);
print(1, '*', m);
print(7, '#', m);
print(17, ' ', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
print(10, ' ', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(12, ' ', m); //第八行
print(4, '#', m);
print(7, '*', m);
print(6, '#', m);
print(13, ' ', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
print(10, ' ', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
print(1, '.', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(11, ' ', m); //第九行
print(3, '.', m);
print(1, '#', m);
print(3, '*', m);
print(1, '.', m);
print(4, '*', m);
print(1, '.', m);
print(1, '*', m);
print(3, '#', m);
print(4, '.', m);
print(10, ' ', m);
print(1, '#', m);
print(3, '.', m);
print(1, '#', m);
print(10, ' ', m);
print(1, '#', m);
print(3, '.', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(11, ' ', m);// 第十行
print(4, '.', m);
print(10, '*', m);
print(2, '#', m);
print(5, '.', m);
print(11, ' ', m);
print(3, '#', m);
print(12, ' ', m);
print(3, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(11, ' ', m);//第11行
print(4, '.', m);
print(4, '*', m);
print(4, ' ', m);
print(5, '*', m);
print(4, '.', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(13, ' ', m);//第12行
print(4, '#', m);
print(8, ' ', m);
print(4, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(11, ' ', m);//第13行
print(6, '#', m);
print(8, ' ', m);
print(6, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(62, '#', m);//第14行
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(1, '#', m); //第15行
print(3, '.', m);
print(1, '#', m);
print(6, '.', m);
print(1, '#', m);
print(1, '.', m);
print(2, '#', m);
print(3, '.', m);
print(1, '#', m);
print(6, '.', m);
print(1, '#', m);
print(1, '.', m);
print(2, '#', m);
print(3, '.', m);
print(1, '#', m);
print(6, '.', m);
print(1, '#', m);
print(1, '.', m);
print(2, '#', m);
print(18, '-', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(43, '#', m);//16
print(18, '-', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(1, '#', m);//17
print(2, '.', m);
print(1, '#', m);
print(4, '.', m);
print(1, '#', m);
print(4, '.', m);
print(2, '#', m);
print(2, '.', m);
print(1, '#', m);
print(4, '.', m);
print(1, '#', m);
print(4, '.', m);
print(2, '#', m);
print(2, '.', m);
print(1, '#', m);
print(4, '.', m);
print(1, '#', m);
print(4, '.', m);
print(21, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(42, '#', m);//18
print(4, ' ', m);
print(1, '#', m);
print(10, '-', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(1, '#', m);//19
print(5, '.', m);
print(1, '#', m);
print(6, '.', m);
print(2, '#', m);
print(5, '.', m);
print(1, '#', m);
print(6, '.', m);
print(2, '#', m);
print(5, '.', m);
print(1, '#', m);
print(6, '.', m);
print(1, '#', m);
print(4, ' ', m);
print(1, '#', m);
print(10, '-', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(42, '#', m);//20
print(4, ' ', m);
print(1, '#', m);
print(10, '-', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(1, '#', m);//21
print(1, '.', m);
print(1, '#', m);
print(2, '.', m);
print(1, '#', m);
print(4, '.', m);
print(1, '#', m);
print(2, '.', m);
print(2, '#', m);
print(1, '.', m);
print(1, '#', m);
print(2, '.', m);
print(1, '#', m);
print(4, '.', m);
print(1, '#', m);
print(2, '.', m);
print(2, '#', m);
print(1, '.', m);
print(1, '#', m);
print(2, '.', m);
print(1, '#', m);
print(4, '.', m);
print(1, '#', m);
print(2, '.', m);
print(1, '#', m);
print(4, ' ', m);
print(1, '#', m);
print(10, '-', m);
print(1, '#', m);
cout << endl;
}
for (int i = 1; i <= m; i++)
{
print(42, '#', m);//22
print(4, ' ', m);
print(12, '#', m);
cout << endl;
}
}
int main()
{
int m;
cin >> m;
printm(m);
return 0;
}
ps:1~3行显示效果正常,m>3之后容易显示错位
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
思考:字符数太多不好数,能否写一个程序让其自动统计每一行的各个字符数量呢?
回顾SDUT编码题目→友链 SDUT OnlineJudge 可以分行统计各个符号的数量
/*全自动统计每行各个符号的个数*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
int row ;
cin >> row; //原始图形的行数
getchar(); //读取输入缓冲区额外的'\n'
for (int i = 1; i <= row; i++)
{
string s;
getline(cin, s);
s += '\n'; //防止越界, 外加方便处理最后一个字符
int l = 0, r = 1;
int res = 1;
printf("row%d:", i);
while (s[r])
{
if (s[l] == s[r])
{
res++;
l++;
r++;
}
else
{
cout << s[l] << res;
l++;
r++;
res = 1;
}
}
cout << endl;
}
return 0;
}
效果→
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Practice~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~The End~~~~~~~~~~~~~~~~~~~~~~~~~~~~~