经典错误:二维数组与实际矩阵的差异所构成的易错点
标签:C语言 二维数组 矩阵
by 小威威
1.矩阵与二维数组的差异
在线性代数的课程中,我们接触到了矩阵这一工具,不难发现它很类似于C语言中的二维数组。虽然我们在C语言中可以用二维数组表示矩阵,但是二者的微小差异仍需要我们注意,否则有可能会导致错误。那么,它们两者有何差异呢?
很明显,由于数组的性质,二维数组有“0”行、“0”列,而矩阵没有。
即矩阵的第一行相当于二维数组的“0”行,矩阵的第一列相当于二维数组的“0”列。
那么,这一差异会带来什么错误呢?下面我用实例介绍。
2.实例
军团再临
燃烧军团即将再次降临艾泽拉斯。萨尔为了改变对抗燃烧军团,使用地震法术,把一处平原改造成了山丘。之后,萨尔需要绘制出新的地图。
平原可以看做一个N*M的棋盘(国际象棋那种)初始海拔为0。每次,萨尔将一个矩阵的海拔全部提高1 。这一个矩阵可以用左上角(sx,sx)和右下角(tx,ty)表示,也即第sx行第sy列的方格到第tx行第ty列的方格这样的一个矩形区域。绘制地图前,萨尔想知道最高的山峰 海拔是多少。使用完地震法术后,萨尔实在太累了,因此他把这个任务交给了你—他最聪明的朋友。
给出平原大小N,M(N行M列,行列都从1开始计算,也即第一行到第N行,第一列到第M列)K 使用地震的次数。N,M,K不超过500
问最高的山峰海拔是多少。
样例输入:
10 10 3
1 1 3 3
3 3 5 5
3 3 10 10
样例输出
3
我的代码:
# include <stdio.h>
int main(void) {
int a[500][500] = {
0}; // 将二维数组内全部元素赋0
int N, M, K, max; // N指行,M指列,K指地震次数,max表示最高海拔
int b[500], c[500], d[500], e[500]; // 构造数组,用于存储坐标(不一定要构造数组)
scanf("%d%d%d", &N, &M, &K);
for (int i = 0; i < K; i++) // 该for循环将坐标值存储到数组中
scanf("%d%d%d%d", &b[i], &c[i], &d[i], &e[i