PTA qls学画图

这一天qls在学校综合楼等电梯的时候看到了电梯数字的样子,突然觉得这样写数字特别有趣,于是自己想用程序跑出来。由于正常大小输出数字太小了,qls决定加大难度,他想画出不同大小的数字,你能帮他解决这个问题吗?

输入格式:

第一行输入一个数字n表示数字的大小(具体大小解释见样例解释)。(3≤n≤10)

第二行输入一串只含数字的字符串。(字符串长度不超过20)

输出格式:

输出字符串的图像,每两个数字图像之间有一个空格(具体解释见样例解释)。

样例1

样例输入
3
123
样例输出
  * *** ***
  *   *   *
  * *** ***
  * *     *
  * *** ***

样例2

样例输入
4
567
样例输出
**** **** ****
*    *       *
*    *       *
**** ****    *
   * *  *    *
   * *  *    *
**** ****    *

提示

数字按照电梯样式并用字符‘*’表示边,大小的定义是在一个n×(2n−1)的长方形表示数字,每两个数字之间用空格间隔。

例如大小为3的0到9样式如下:

5e0e70f470.png

思路:

模拟,单纯耗时间。

可以把数字切割一下:

1、1行

2、2~n-1行

3、n行

4、n+1~n*2-2行

5、n*2-1行

之后就是分类讨论判断。

可以把它们分成4类:

1、一行都是*。

2、只有头是*。

3、只有尾是*;

4、只有头尾是*。

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl "\n"
 
const ll N = 1e4+7;
ll n,m,k;
ll v[100];
string s;
 
void sc(ll x){
	if(x == 1)for(ll i = 0 ; i < n ; i ++)cout << "*";
	if(x == 2)for(ll i = 0 ; i < n ; i ++)i == 0 ?cout << "*" : cout << " ";
	if(x == 3)for(ll i = 0 ; i < n ; i ++)i == n-1 ?cout << "*" : cout << " ";
	if(x == 4)for(ll i = 0 ; i < n ; i ++)i == 0 || i == n-1 ?cout << "*" : cout << " ";
	return;
}
 
void solve(){
	cin >> n;
	cin >> s;
	m=s.size();
	for(ll i = 0 ; i < m ; i ++)v[i]=s[i]-'0';
	for(ll i = 1 ; i < n*2 ; i ++){
		for(ll j = 0 ; j < m ; j ++){
			if(j > 0)cout << " ";
			if(v[j] == 1)sc(3);
			if(i == 1){
				if(v[j] == 2 || v[j] == 3 || v[j] == 5 || v[j] == 6 || v[j] == 7 || v[j] == 8 || v[j] == 9 || v[j] == 0)sc(1);
				if(v[j] == 4)sc(4);
			}else if(i < n){
				if(v[j] == 2 || v[j] == 3 || v[j] == 7)sc(3);
				if(v[j] == 5 || v[j] == 6 )sc(2);
				if(v[j] == 0 || v[j] == 4 || v[j] == 8 || v[j] == 9)sc(4);
			}else if(i == n){
				if(v[j] == 2 || v[j] == 3 || v[j] == 4 || v[j] == 5 || v[j] == 6 || v[j] == 8 || v[j] == 9)sc(1);
				if(v[j] == 7)sc(3);
				if(v[j] == 0)sc(4);
			}else if(i < n*2-1){
				if(v[j] == 2)sc(2);
				if(v[j] == 3 || v[j] == 4 || v[j] == 5 || v[j] == 7 || v[j] == 9)sc(3);
				if(v[j] == 0 || v[j] == 6 || v[j] == 8)sc(4);
			}else if(i == n*2-1){
				if(v[j] == 2 || v[j] == 3 || v[j] == 5 || v[j] == 6 || v[j] == 8 || v[j] == 9 || v[j] == 0)sc(1);
				if(v[j] == 4 || v[j] == 7)sc(3);
			}
		}
		cout << endl;
	}
	return ;
}
 
int main(){
	ll t=1;//cin >> t;
	while(t --)solve();
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值