解题思路:遍历矩阵中各个元素,有可能直接是数字,也可能是字符串表达式,输入时碰到数字直接转为int,便于后续条件判断

碰到表达式要进行处理;1.判断是三种操作中哪一个2.取出左上角和右下角的坐标3.代入具体的操作函数,返回对应值

注意事项:1.在操作函数内部也需要遍历矩阵,所以同样要处理字符串

2.优化--字符串处理部分可以封装到函数,提高代码复用性,后续赋值部分不行,处理方法不同

参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import math
 
def SUM(upper_left, lower_right):
    sum_up = 0
    for in range(int(upper_left[0]) - 1int(lower_right[0])):
        for in range(int(upper_left[1]) - 1int(lower_right[1])):
            if type(matrix[a][b]) != str:
                sum_up += matrix[a][b]
            else:
                cur = matrix[a][b][3:].replace("(", "").replace(")", "")
                upper_left, lower_right = cur.split(":")
                upper_left = upper_left.split(",")
                lower_right = lower_right.split(",")
                if matrix[a][b][:3== "SUM"# 递归调用其它操作函数,因为题目保证了不会死锁
                    sum_up += SUM(upper_left, lower_right) # 处理得到数字直接相加即可,因为是求和
                elif matrix[a][b][:3== "AVG":
                    sum_up += AVG(upper_left, lower_right)
                else:
                    sum_up += STD(upper_left, lower_right)
    return sum_up
 
 
def AVG(upper_left, lower_right):#求平均值,先求和再除以元素个数
    avg = SUM(upper_left, lower_right) / (
            (int(lower_right[0]) - int(upper_left[0]) + 1* (int(lower_right[1]) - int(upper_left[1]) + 1))
    return avg
 
 
def STD(upper_left, lower_right):
    avg = AVG(upper_left, lower_right)
    sum_up = 0
    for in range(int(upper_left[0]) - 1int(lower_right[0])): # 相同的处理逻辑
        for in range(int(upper_left[1]) - 1int(lower_right[1])):
            if type(matrix[p][q]) != str:#如果已经是数字直接计算即可
                sum_up += (matrix[p][q] - avg) ** 2
            else:
                cur = matrix[p][q][3:].replace("(", "").replace(")", "")
                upper_left, lower_right = cur.split(":")
                upper_left = upper_left.split(",")
                lower_right = lower_right.split(",")
                if matrix[p][q][:3== "SUM":
                    sum_up += (SUM(upper_left, lower_right) - avg) ** 2 # 方差的计算和求和不同,不了解请仔细查看题目
                elif matrix[p][q][:3== "AVG":
                    sum_up += (AVG(upper_left, lower_right) - avg) ** 2
                else:
                    sum_up += (STD(upper_left, lower_right) - avg) ** 2
    variance = sum_up / (
            (int(lower_right[0]) - int(upper_left[0]) + 1* (int(lower_right[1]) - int(upper_left[1]) + 1)) # 求方差
    return math.sqrt(variance) #求标准差
 
 
n, m = map(intinput().strip().split())
matrix = []
 
for in range(n):#读取输入
    temp = input().split()
    for in range(len(temp)):
        if "0" <= temp[j][0] <= "9":#判断是数字还是表达式,是数字直接转int型
            temp[j] = int(temp[j])
    matrix.append(temp)
 
for in range(n):#遍历矩阵
    for in range(m):
        if type(matrix[x][y]) == str:
            cur = matrix[x][y][3:].replace("(", "").replace(")", "")
            upper_left, lower_right = cur.split(":")
            upper_left = upper_left.split(",")
            lower_right = lower_right.split(",")
            if matrix[x][y][:3== "SUM":
                matrix[x][y] = SUM(upper_left, lower_right) # 处理结束后直接修改原矩阵,便于后续函数调用
            elif matrix[x][y][:3== "AVG":
                matrix[x][y] = AVG(upper_left, lower_right)
            else:
                matrix[x][y] = STD(upper_left, lower_right)
        print('{:.2f}'.format(matrix[x][y]), end = " ")
    print()


点赞(0)
 

9.9 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论