文章目录
前言
大概是最后一次参加蓝桥杯,Python组模拟题练习,仅作为个人总结,分享给有需要的人,如有错误,请纠正,万分感谢!
问题描述
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
时间限制:1.0s 内存限制:256.0MB
一、 解答
1. 剖析:
- 本题先对第一行第一列从A进行延伸,
即如果是4行3列,则先定位:
ABC
B
C
D
如果是3行4列,则先定位:
ABCD
B
C
然而可以发现,我们可以列一个字母表,里面包含所有需要用到的字母,字母表的长度由行数和列数中最大的一个数字决定 - 其次,从第二行开始的每一行用上一行的除去最后一个字母进行补齐
2. 代码:
a=list(map(int,input().split())) #a[0]代表行数,a[1]代表字母数
b=[]
if a[0]>=a[1]:
max=a[0] #取最大的数,就能确定字母表最后一个字母是什么
else:
max=a[1]
for i in range(max):
#A的ASCII码是65,以此类推,多少个字幕往后加就是了
b+=chr(65+i) #b存放字母列表
t=b[:a[1]]
print("".join(t)) #列表转化为字符串输出
if(a[1]==1):
for i in range(a[0]-1):
print(b[i+1])
else:
for i in range(a[0]-1):
t=[b[i+1]]+t[:-1] #因为单独一个b[i+1]是个字符串,t[:-1]是列表,类型不一致,所以需要加[]在其外
print("".join(t))
3. 重点知识:
- A的ASCII码是65,ASCII码转换为符号利用chr(ASCII码)
- 列表转化为字符串输出方式:print("".join(列表))
二、易错点及原因
(注意:以下程序有部分思想或内容一定是错的,正确的在上方代码)
a=list(map(int,input().split()))#a[0]是行数,a[1]是字母数
#A的ASCII码是65,以此类推,多少个字幕往后加就是了
b=[]
for i in range(a[1]):
b+=chr(65+i)#存放字幕列表
t=b
for i in range(a[0]):
print("".join(t))#列表转化为字符串
t=[b[i+1]]+t[:-1]#因为单独一个b[i+1]是个字符串,类型不一致
IndexError: list index out of range
原因:当输入为1 1时,在第9步,b[i+1]和t[:-1]根本取不到
进行更改:
a=list(map(int,input().split()))#a[0]是行数,a[1]是字母数
#A的ASCII码是65,以此类推,多少个字幕往后加就是了
b=[]
for i in range(a[1]):
b+=chr(65+i)#存放字幕列表
t=b
print("".join(t))#列表转化为字符串
for i in range(a[0]-1):
t=[b[i+1]]+t[:-1]#因为单独一个b[i+1]是个字符串,类型不一致
print("".join(t))#列表转化为字符串
问题: 只是修改了输入1 1
的bug,当我这样如果输入5 1
时,结果还是IndexError: list index out of range
原因:当输入为5 1时,在第9步,b[i+1]和t[:-1]根本取不到
进行更改:
a=list(map(int,input().split()))#a[0]是行数,a[1]是字母数
#A的ASCII码是65,以此类推,多少个字幕往后加就是了
if(a[1]==1):
for i in range(a[0]):
print('A')
else:
b=[]
for i in range(a[1]):
b+=chr(65+i)#存放字母列表
t=b
print("".join(t))#列表转化为字符串
for i in range(a[0]-1):
t=[b[i+1]]+t[:-1]#因为单独一个b[i+1]是个字符串,类型不一致
print("".join(t))#列表转化为字符串
问题: 这种思想本质上不正确,题目的意思是第一行第一列都是从A开始延伸,而我这样如果输入5 1
,本应依次每行分别出现A B C D E,结果则每行分别出现A A A A A
方法:需要取得行数和列数中最大的一个数字才可以定位整个需要输出的字母表范围。