蓝桥杯竞赛真题:图片旋转问题

图片旋转是对图片最简单的处理方式之一,在本题中,需要对图片顺时针旋转 90 度。用一个 n×m 的二维数组来表示一个图片,例如给出一个 3×4 的图片的例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转 90 度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片。
【输入格式】
输入的第一行包含两个整数 n 和 m,分别表示行数和列数。接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像 素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。
【输出格式】
输出 m 行 n 列,表示旋转后的图片。

【样例输入】
3 4
1 3 5 7
9 8 7 6
3 5 9 7
【样例输出】
3 9 1
5 8 3
9 7 5
7 6 7

我们使用python来解决这道问题,解答如下:

n,m = map(int ,input().split())       #map的作用是把输入的str映射成int
lst = []                              
for i in range(n):
	#先用split把输入的字符串转换成字符串列表,然后用int映射成整形map,最后再转换成整形list
	lst.append(list(map(int,input().split())))   

# print(lst)
n_list =[]
for i in range(m):
	n_line = [ lst[n-1-j][i] for j in range(n) ]
	n_list.append(n_line)

for x in n_list:
	for y in x:
		print(y,end=' ')
	print('')

运行结果如下:
在这里插入图片描述
此题涉及的知识点有:
1.input()函数获取用户的键盘输入生成字符串;
2.的split方法分割字符串至字符串列表;
3.map()方法把字符串列表映射成整形map对象;
4.list方法强行将map对象转成list对象;
5.列表生成式的方法生成新的整形列表;
6…append方法来添加列表元素;
7.print函数的end参数的使用和输出空字符串换行技巧;

此题的核心算法:
坐标变换映射,我们一开始可以观察坐标变换的规律,比如
新坐标(1,1)对应旧坐标(3,1)
新坐标(1,2)对应旧坐标(2,1)
新坐标(1,3)对应旧坐标(1,1)
新坐标(2,1)对应旧坐标(3,2)
新坐标(2,2)对应旧坐标(2,2)
新坐标(2,3)对应旧坐标(1,2)

我们很快就能发现规律,也就是新坐标的横坐标是旧坐标的纵坐标,新坐标的纵坐标是旧坐标的补数,因此我们就可以写出核心算法了:

n_list = [ [ lst[n-1-j][i] for j in range(n) ] for i in range(m)]

注意这句话用列表生成式的嵌套简化了源代码中的2个for循环。

发布了207 篇原创文章 · 获赞 16 · 访问量 9952

猜你喜欢

转载自blog.csdn.net/weixin_41855010/article/details/104569185