python习题:OpenJudge藏头诗讲解

一、题目

雍正皇帝不能忍受任何人说清朝或者他坏话,以至于他大兴文字狱。因此老百姓书写任何东西都得很小心。诗人写诗也得担心。一些诗人发明了一种奇怪写诗方法,只有TA们朋友圈的人才能看懂。这样的诗统称为藏头诗。

一首藏头诗,是一个N×N 的字符矩阵,看起来杂乱无章没啥意思。但是,如果你用特定的顺序读这些字符,你就能看懂。正确的阅读顺序如下面左图所示:

  顺着箭头读,你会看到“THISISAVERYGOODPOEMITHINK”,这就有点意思了。

       过了一段时间后,诗人们发现,雍正的杀手,血滴子,也学会了读这样的诗。这很危险。所以诗人们发明了新的写诗顺序,如上面右图所示。

        诗人想把所有的老写法的诗,都转成新写法的诗歌。请你帮助TA们。

输入

一共不超过10组数据。
在每组数据里:
第一行是一个整数N ( 1 <= N <= 100), 表明诗是一个N×N 的字符矩阵,仅包含大写字母。
接下来是N行。每行是一个N个字符的字符串。这N行表示一首老写法的诗。

输出

对每组数据,输出新写法的诗。

样例输入

5
THSAD 
IIVOP 
SEOOH 
RGETI 
YMINK
2
AB
CD
4
ABCD
EFGH
IJKL
MNOP

样例输出

THISI
POEMS
DNKIA
OIHTV
OGYRE
AB
DC
ABEI
KHLF
NPOC
MJGD

二、解析:

首先读取方式是一个Z字型遍历读取,然后用回型输出,我在解决Z字形遍历时选择以对角线为分界,对角线以上包括(对角线)为一部分用一个for循环遍历读取,以下再用一个for循环遍历读取。然后关于输出,我采用的是暴力遍历,先创建一个NxN的二维列表,然后逐一与之前Z字型遍历读取的列表对应。代码如下:

n = int(input())
lst = []
for i in range(n):
    lst.append(input())
lst1 = []
flag = 1
for i in range(n):
    r = 0
    for j in range(i,-1,-1):#添加上半部分
        if flag % 2==0 or flag==1:
            lst1.append(lst[r][j])
    
        if flag % 2 !=0 and flag != 1:
            lst1.append(lst[j][r])
        r+=1
    flag+=1
    if i == n-1:#添加下半部分
        if flag % 2 == 0:
            flag = 2
        else:
            flag = 1
        m = 1
        for k in range(1,n):
            m = k
            for c in range(n-1,k-1,-1):
                if flag %2 == 0:
                    lst1.append(lst[m][c])
                else:
                    lst1.append(lst[c][m])
                m+=1
            flag +=1
lst2 = [[0 for i in range(n) ]for j in range(n)]#输出的二维列表
I,J = 0,0
C = 0
while C < n*n:
    while J < n and lst2[I][J]==0:
        lst2[I][J] = lst1[C]
        C+=1
        J+=1
    J-=1
    I+=1
    while I < n and lst2[I][J]==0:
        lst2[I][J] = lst1[C]
        C+=1
        I+=1
    I-=1
    J-=1
    while J >= 0 and lst2[I][J]==0:
        lst2[I][J] = lst1[C]
        J-=1
        C+=1
    J +=1
    I -=1

    while I >= 0 and lst2[I][J]==0:
        lst2[I][J] = lst1[C]
        I-=1
        C+=1
    I+=1
    J+=1
for i in range(n):
    for j in range(n):
        print(lst2[i][j],end = "")
    print("")

三、运行结果:

初学者,许多地方不够规范,请大家见谅~~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值