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