(1)定义:直接按照题目含义模拟即可,一般不涉及算法。
(2)注意:读懂题:理清楚题目流程;
代码和步骤一一对应:变量名,函数名,函数功能;
提取重复的部分,写成对应的函数(子模块);
按顺序写,分块调试。
例题1:饮料换购
题目描述:
乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊c型饮料,凭3个瓶盖可以再换一瓶饮料,并且可以一直循环下去(但是不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶饮料,最终他一共可以喝到多少瓶饮料?
输入描述:
输入一个整数n,0 <= n <= 1000,表示开始购买的饮料数量。
输出描述:
输出一个整数,表示实际得到的饮料数量。
参考答案:
方法1:
#n表示瓶盖的数量
n = int(input())
ans = n
while True:
if n >= 3:
#用三个瓶盖换一瓶饮料,原来的瓶数减一
n -= 3
#瓶子数量加一
ans += 1
n += 1
else:
break
print(ans)
运行结果:
方法2:
#n表示瓶盖的数量
n = int(input())
ans = n
while n >= 3:
ans += n // 3
n = n // 3 + n % 3
print(ans)
运行结果同上。
例题2:图像模糊
题目描述:
小蓝有一张黑白图像,由n*m个像素组成,其中从上到下共n行,每行从左到右共m列,每个像素由一个0到255之间的灰度值表示。
现在,小蓝要对图像进行模糊处理,操作的方法为:
对于每个像素,将以它为中心3*3区域内的所有像素(可能是9个像素或少于9个像素)求和后除以这个范围内的像素个数(取下整) ,得到的值就是模糊后的结果。
请注意每个像素都要用原图中的灰度值计算求和。
输入描述:
输入的第一行包含两个整数n和m;
第二行到n+1行每行包含两个m个整数,表示每个像素的灰度值,相邻整数之间用一个空格隔开,
其中,1 <= n,m <= 100。
输出描述:
输出n行,每行包括m个整数,相邻两个整数之间用一个空格隔开,表示模糊后的图像。
参考答案:
#定义二维列表
n,m = map(int,input().split())
Map = []
#需要读入n行
for i in range(n):
a = list(map(int,input().split()))
Map.append(a)
# 构建一个n行m列的二维列表
ans = [[0]*m for i in range(n)]
# print(ans)
for i in range(n):
for j in range(m):
tot, cnt = 0, 0 # 分别表示总数和个数
for delta_x in [-1,0,1]:
for delta_y in [-1,0,1]:
x = i + delta_x
y = j + delta_y
#这九个位置都可以有,但不一定都存在,所以还要判断是否在规定范围内
if 0 <= x < n and 0 <= y < m:
tot += Map[x][y] # 这步就是求和
cnt += 1
ans[i][j] = tot // cnt
for a in ans:
print(" ".join(map(str,a)))
运行结果:
我来说一下思路。
这个题是这样计算的,我用一个例子:
3 4
0 0 0 255
0 0 255 0
0 30 255 255
比如这个数组, 取右上角的255,则它周围仅有三个数字:0,0,255,所以根据题意,这个数字的计算结果应该是(0 + 0 + 255 + 255)// 4 = 127,原理就是这样。
接下来我来解释代码中的几个难点:
(1)
#需要读入n行
for i in range(n):
a = list(map(int,input().split()))
Map.append(a)
这部分的结果是:
将输入的矩阵转换为一个列表。
(2)
遍历3*3区域内的每个元素,用到的是我上一篇文章中写的知识点。 此时的位置是(i,j),那么它旁边的位置就是: (i-1,j-1),(i-1,j+0),(i-1,j+1) (i+0,j-1),(i+0,j+0),(i+0,j+1) (i+1,j-1),(i+1,j+0),(i+1,j+1)
关于这个题的难点,我只写这么多,若还有疑问,欢迎一起讨论。
例题3:螺旋矩阵
题目描述:
对于一个n行m列的矩阵,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。例如,一个4行5列的矩阵如图所示。
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
输入描述:
输入格式:
第一行输入两个正整数n和m,分别表示螺旋矩阵的行数和列数;
第二行包含两个整数r和c,表示要求的行号和列号;
其中,2 < = n,m <= 1000,1 <= r <= n , 1 <= c <= m。
输出描述:
输出一个整数,表示螺旋矩阵中第r行c列的值。
参考答案:
n,m = map(int,input().split())
r,c = map(int,input().split())
Map = [[0]* m for i in range(n)]
#模拟行进过程,(x,y) = value
x,y = 0,0
value = 1
Map[x][y] = value
while value < n * m:
# 不断向右走,且要保证下一个点在所规定的范围内,保证下一个点没有数字
while y+1 < m and Map[x][y+1] == 0:
value += 1
y += 1
Map[x][y] = value
#往下走
while x+1 < n and Map[x+1][y] == 0:
value += 1
x += 1
Map[x][y] = value
# 往左走
while y-1 >= 0and Map[x][y-1] == 0:
value += 1
y -= 1
Map[x][y] = value
# 往上走
while x-1 >= 0and Map[x-1][y] == 0:
value += 1
x -= 1
Map[x][y] = value
print(Map[r-1][c-1])
运行结果:
这个题看着很难,但是知识点我都重复过了,若有疑问,欢迎提出,一起探讨。
OK,今天就写这么多,明天继续!