蓝桥杯打印大X(模拟)

1. 问题描述:

小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度。 为了便于比对空格,所有的空白位置都以句点符来代替。 要求输入两个整数m n,表示笔的宽度,X的高度。 

输入

存在多组数据每组测试数据输入一行,包含两个整数,用空格分开 (0<m<n, 3<n<1000, 保证n是奇数) 

输出

要求输出一个大X 

样例输入:

3 9
4 21

样例输出:

***.....***
.***...***.
..***.***..
...*****...
....***....
...*****...
..***.***..
.***...***.
***.....***
****................****
.****..............****.
..****............****..
...****..........****...
....****........****....
.....****......****.....
......****....****......
.......****..****.......
........********........
.........******.........
..........****..........
.........******.........
........********........
.......****..****.......
......****....****......
.....****......****.....
....****........****....
...****..........****...
..****............****..
.****..............****.
****................****

来源:http://oj.ecustacm.cn/problem.php?id=1263

2. 思路分析:

分析题目可以知道这种题目就是要找出图形的规律,使用循环来控制输出的字符即可,观察图形我们可以先计算出图形一开始的时候中间点的数目,只有当点数大于0的时候我们才执行循环这样就可以输出若干行中间点数大于0的行,然后计算出中间点数为0的星号的数目,一直输出到星号的数目等于了笔画的宽度,由于下方的图形与上方的图形是对称的而且下方中间点数为0的时候不好计算到什么时候为止输出就结束了所以相关的几行可以在输出上方图形的时候将其记录下列表中这样下方可以输出若干行对称的图形,然后在输出中间点数有的点数下的剩余对称图形,主要涉及到下标的变换中的细节处理,因为使用的是python语言,所以在使用输出语句输出若干个对象的时候需要使用sep=""规定对象之间的分隔符为空串,如果不写默认是空格

3. 代码如下:

if __name__ == '__main__':
    while True:
        # n是画笔的宽度, m是高度
        n, m = map(int, input().split())
        # t为中间点的数目
        i, t = 0, m // 2 * 2 - n
        s = list()
        while t > 0:
            # print语句使用sep属性规定输出对象之间的分割符
            print("." * i, "*" * n, "." * t, "*" * n, "." * i, sep="")
            t -= 2
            i += 1
        # 保存一下后面中间存在点的情况
        backDots = i - 1
        stars = n * 2 + t
        # 注意是大于等于n
        while stars >= n:
            # 考虑到是对称的而且输出下面的若干行的时候计算出什么时候输出就停止了会比较困难
            s.append("." * i + "*" * stars + "." * i)
            print("." * i, "*" * stars, "." * i, sep="")
            i += 1
            stars -= 2
        for j in range(len(s) - 2, -1, -1):
            # 逆序输出
            print(s[j])
        # print(s)
        # 上面的循环退出之后那么t要不就是等于0要不就是小于0的所以这个时候需要加上2(每一次的间隔是2)
        t += 2
        while backDots >= 0:
            print("." * backDots, "*" * n, "." * t, "*" * n, "." * backDots, sep="")
            backDots -= 1
            t += 2

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值