2023年 3月 19日

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字型遍历读取的列表对应。代码如下:

  1. n = int(input())
  2. lst = []
  3. for i in range(n):
  4. lst.append(input())
  5. lst1 = []
  6. flag = 1
  7. for i in range(n):
  8. r = 0
  9. for j in range(i,-1,-1):#添加上半部分
  10. if flag % 2==0 or flag==1:
  11. lst1.append(lst[r][j])
  12. if flag % 2 !=0 and flag != 1:
  13. lst1.append(lst[j][r])
  14. r+=1
  15. flag+=1
  16. if i == n-1:#添加下半部分
  17. if flag % 2 == 0:
  18. flag = 2
  19. else:
  20. flag = 1
  21. m = 1
  22. for k in range(1,n):
  23. m = k
  24. for c in range(n-1,k-1,-1):
  25. if flag %2 == 0:
  26. lst1.append(lst[m][c])
  27. else:
  28. lst1.append(lst[c][m])
  29. m+=1
  30. flag +=1
  31. lst2 = [[0 for i in range(n) ]for j in range(n)]#输出的二维列表
  32. I,J = 0,0
  33. C = 0
  34. while C < n*n:
  35. while J < n and lst2[I][J]==0:
  36. lst2[I][J] = lst1[C]
  37. C+=1
  38. J+=1
  39. J-=1
  40. I+=1
  41. while I < n and lst2[I][J]==0:
  42. lst2[I][J] = lst1[C]
  43. C+=1
  44. I+=1
  45. I-=1
  46. J-=1
  47. while J >= 0 and lst2[I][J]==0:
  48. lst2[I][J] = lst1[C]
  49. J-=1
  50. C+=1
  51. J +=1
  52. I -=1
  53. while I >= 0 and lst2[I][J]==0:
  54. lst2[I][J] = lst1[C]
  55. I-=1
  56. C+=1
  57. I+=1
  58. J+=1
  59. for i in range(n):
  60. for j in range(n):
  61. print(lst2[i][j],end = "")
  62. print("")

三、运行结果:

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