#include<stdio.h>
int main()
{
int n[3][4] = {0};
int a,b;
for (a=0;a<3;a++)
{
for (b=0;b<4;b++)
{
scanf("%d", &n[a][b]); //利用循环嵌套对二维数组进行赋值
}
}
int row = 0;
int column = 0, column_1 = 0, column_2 = 0, column_3 = 0;
int max_1 = 0, max_2 = 0, max_3 = 0, max = 0;
int c,d;
max_1 = n[0][0]; //此处采用标记最大值交换法来寻找每一行的最大项
max_2 = n[1][0]; //通过比较每一行的最大值来寻找整个数组中的最大值
max_3 = n[2][0];
for (c=0;c<3;c++)
{
for (d=1;d<4;d++)
{
if (c==0) //第一行的最大值
{
if (max_1 < n[0][d])
{
max_1 = n[0][d];
column_1 = d;
}
}
if (c==1) //第二行的最大值
{
if (max_2 < n[1][d])
{
max_2 = n[1][d];
column_2 = d;
}
}
if (c==2) //第三行的最大值
{
if (max_3 < n[2][d])
{
max_3 = n[2][d];
column_3 = d;
}
}
}
}
if (max_1>max_2) //通过逻辑比较选出最大值,并标记记录其所在的行列
{
if (max_1>max_3)
{
max = max_1;
column = column_1;
row = 0;
}
else
{
max = max_3;
column = column_3;
row = 2;
}
}
else if (max_1 == max_2||max_1 == max_3||max_2 == max_3) //此处作用为判断每行的最大值是否相同,若相同,则
{ //以第一个为准,读者可视题目要求进行删减
max = max_1;
row = 0;
column = column_1;
}
else//1<2
{
if (max_2 > max_3)
{
max = max_2;
row = 1;
column = column_2;
}
else
{
max = max_3;
row = 2;
column = column_3;
}
}
printf("max=%d\n", max);
printf("row=%d\n", row);
printf("column=%d", column);
return 0;
}
此代码中的二维数组规模读者可根据需求进行更换即可,解答本题值得注意的是对于最大值的查找所使用的方式的选择以及对于如何输出其坐标的问题的解决。
对于寻找最大值的方法,读者也可选择使用排序法找到最大值,但这种方式需要在设立一个数组来保留原数组的值,因此采用标记法来标记出最大值的代号可能是更优解。
其次读者须知,二维数组可以将其理解为一个带有指针指向的一维数组,因此根据此原理,可以通过查找每一行的“小王”,所谓强强比较,选择出每行的王之后再将他们进行对比。
再者对于最大值坐标的查找,作者所采用的方法可能略显复杂,个人认为并不是最优解,读者在解决此题需要注意的是不需要去对最大值的行坐标去进行太多操作,可以通过命名的方法命名每一行的最大值,通过命名的后缀来得知最大值的行坐标。对于列坐标读者需要注意的是,要单独去记录每一行最大值的列坐标,这里较容易遗忘,作者一开始也在这跌了跟头,可设置一个总的column,以及几个小的column来记录小王们的列坐标,最后将大column进行赋值。