BJTU 十字架

十字架

成绩: 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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值