求出N×M整型数组的最大元素及其所在的行坐标及列坐标(如果最大元素不唯一,选择位置在最前面的一个)。 函数接口定义: int fun(int array[N][M]) ; 注意:函数只需靠return返回最大元素的值, 行、列坐标通过全局变量传递。 裁判测试程序样例: #include <stdio.h> #define N 4 #define M 3 #include <stdio.h> int Row,Col ; // 最大数的行列标,全局变量 int fun(int array[N][M]) ; main() { int a[N][M],i,j,max; for(i=0;i<N;i++) for(j=0;j<M;j++) scanf("%d",&a[i][j]); max=fun(a); printf("max=%d,row=%d,col=%d",max,Row,Col); //Row,Col代表最大值的下标 } /* 请在这里填写答案 */ 输入样例: 1 10 2 3 12 5 4 11 3 5 12 4 输出样例: max=12,row=1,col=1 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB C (gcc) 1 无提交
首先,函数接口定义是int fun(int array[N][M]),所以这个函数接收一个二维数组作为参数。全局变量Row和Col需要在函数中被修改,以便主函数可以正确输出结果。
那我该怎么开始呢?首先需要遍历整个数组,找到最大的元素。初始化的时候,应该假设第一个元素就是最大的,然后逐个比较。如果遇到更大的值,就更新最大值,同时更新Row和Col。如果遇到相等的,因为要选位置最前面的,所以不需要更新。这样就能保证第一个出现的最大值被保留下来。
那具体步骤应该是这样的:
- 初始化当前最大值max_val为数组的第一个元素array[0][0],Row和Col设为0。
- 使用双重循环遍历数组的每一个元素。
- 对于每个元素array[i][j],如果它比当前max_val大,则更新max_val为这个值,同时Row=i,Col=j。
- 循环结束后,返回max_val。
- 全局变量Row和Col已经被正确设置,所以主函数可以输出。
需要注意的问题有哪些呢?比如数组中的元素可能都是负数的情况,这时候初始化的第一个元素是否能正确处理?是的,因为初始值是正确的。此外,如果最大值出现在多个位置,比如后面出现相同的值,但不会覆盖之前的Row和Col,所以没问题,因为一旦遇到更大的才会更新,相等的话不会处理。
那代码的大致结构应该是这样的:
int fun(int array[N][M]) { int max_val = array[0][0]; Row = 0; Col = 0; for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (array[i][j] > max_val) { max_val = array[i][j]; Row = i; Col = j; } } } return max_val; }
这样对吗?测试样例中的输入是一个4行3列的数组:
输入样例: 1 10 2 3 12 5 4 11 3 5 12 4
最大值是12,出现的位置在第二行(行号为1,因为从0开始)的第二列吗?比如,第二行的数据是3、12、5,那么j=1的位置是12。然后第三行是4、11、3,第四行是5、12、4,其中第四行的第三个元素是12,j是2。但按照代码逻辑,当遍历到第二行的12时,会更新max_val,Row=1,Col=1。之后即使遇到同样12的值,也不会覆盖,因为条件判断是“>”而不是“>=”。所以这样就能保证第一个最大的值的位置被保留下来。那测试样例的输出就是row=1,col=1,符合预期。
那代码应该没问题。有没有可能的错误?比如数组的大小是否正确,比如N和M是否正确使用。题目中数组的定义是array[N][M],所以在循环的时候,外层是i从0到N-1,内层j从0到M-1,这没问题。所以代码的结构正确。
有没有可能越界?比如数组的行列是否正确。例如,如果数组是4行3列,i的范围是0到3,j是0到2,循环条件i<N和j<M是正确的。
那这样应该就能正确完成任务了。所以最终的函数应该像上面那样写。要解决这个问题,我们需要编写一个函数来遍历二维数组,找到最大值及其位置。以下是详细的实现步骤:
方法思路
- 初始化最大值:将数组的第一个元素设为初始最大值,并记录其位置(行0,列0)。
- 遍历数组:使用双重循环逐个比较数组元素。
- 更新最大值:当发现更大的元素时,更新最大值及其位置。
- 处理重复值:由于题目要求保留第一个出现的最大值,遇到相等元素时不更新位置。
解决代码
int Row, Col;
int fun(int array[N][M]) {
int max_val = array[0][0];
Row = 0;
Col = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (array[i][j] > max_val) {
max_val = array[i][j];
Row = i;
Col = j;
}
}
}
return max_val;
}
代码解释
- 全局变量:
Row
和Col
用于存储最大值的位置,由函数更新。 - 初始化:将数组的第一个元素作为初始最大值,并设置初始位置。
- 双重循环遍历:外层循环遍历行,内层循环遍历列。
- 比较与更新:若当前元素大于已知最大值,则更新最大值及其位置。
- 返回最大值:函数返回最大值,而位置信息通过全局变量传递。
此方法确保在遍历过程中正确记录第一个出现的最大值的位置,满足题目要求。