/*从零开始的洛谷刷题笔记*/ P1000 超级玛丽游戏(拓展:打表)

难度分类:入门

题目描述

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

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

输入格式

输出格式

如描述

输入输出样例

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

思路(?)

考察打印函数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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SDUT OnlineJudge

SDUT OnlineJudge

超级玛丽游戏 - 洛谷

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~The End~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值