十字架
成绩: 5 / 折扣: 0.8
题面描述
给出一个数 n ,打印 n 层十字架。如下图所示为 n = 1 时的十字架 :
输入数据
输入数据的第一行为一个正整数 T ,表示有 T 组数据。
接下来的 T 行中每行为一个正整数 n ,表示输入的层数 (T <= 20, 0 < n <= 20) 。
输出数据
输出 T 组结果,每一组输出的第一行为 “Case #x:” ,冒号后面没有空格,
随后为该组数据的答案。
样例输入
2
1
2
样例输出
Case 1:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
Case 2:
..$$$$$$$$$..
..$.......$..
$$$.$$$$$.$$$
$...$...$...$
$.$$$.$.$$$.$
$.$...$...$.$
$.$.$$$$$.$.$
$.$...$...$.$
$.$$$.$.$$$.$
$...$...$...$
$$$.$$$$$.$$$
..$.......$..
..$$$$$$$$$..
思路:
观察到十字架是大十字架包住了小十字架,比如输入n=2时,从第三行开始要打印的符号是 “$$$” + “n = 1时的十字架第1行去掉第一个与最后一个 ‘.’ " + “$$$”,第4行到第10行是“$.” + “n = 1时的十字架的第2行到第8行” + “.$”,以此类推,把每一层的字符装进列表(队列),每次递归读取队头元素,在读取到的当前行加上对应元素,然后从队尾入队作为n+1层十字架的对应行,再删除队头元素。采用递归实现:
def func(n):
if n == 1:
return
else:
func(n - 1)
ls.append(".." + "$" * (5 + (n - 1) * 4) + "..")
ls.append("..$" + "." * (3 + (n - 1) * 4) + "$..")
ls.append("$$$" + ls[0][1:len(ls[0]) - 1] + "$$$")
del ls[0]
for j in range(3 + (n - 1) * 4):
ls.append("$." + ls[0] + ".$")
del ls[0]
ls.append("$$$" + ls[0][1:len(ls[0]) - 1] + "$$$")
del ls[0]
ls.append("..$" + "." * (3 + (n - 1) * 4) + "$..")
ls.append(".." + "$" * (5 + (n - 1) * 4) + "..")
T = int(input())
for i in range(T):
n = int(input())
ls = (['..$$$$$..', '..$...$..', '$$$.$.$$$', '$...$...$', '$.$$$$$.$', '$...$...$', '$$$.$.$$$',
'..$...$..', '..$$$$$..'])
func(n)
print("Case {}:".format(i + 1))
for j in range(len(ls)):
print(ls[0])
del ls[0]