求二维整型数组的“最大点”。二维数组的“最大点”定义为:某个数是所在行的最大值,并且是所在列的最大值。注意:某行或某列上可能有多个“最大点”。
【输入形式】
从控制台读入二维数组。
第一行只有以空格分隔的两个正整数n和m(n,m<=10),n代表二维数组的行数,m代表二维数组的列数。
然后在后续n行上输入二维数组的元素,每行有m个以若干空格分隔的整数,代表二维数组在该行上的所有元素。
【输出形式】
向控制台输出二维数组的“最大点”,按行下标、列下标从小到大的顺序输出,每行一个,先输出“最大点”数值,再输出对应的行数、列数(行列都从1开始计数),以一个空格分隔。
【样例输入】
3? 4
8? 60? 7? 100
10? 498? 12? 49
-71? 132? 4? 85
【样例输出】
100 1 4
498 2 2
【样例说明】
输入了一个三行四列的二维数组,第一行第四列的元素100是第一行的最大元素,同时也是第四列的最大元素,所以该元素是“最大点”,输出100 1 4。同样第二行第二列的元素498也是第二行的最大元素,同时是第二列的最大元素,故该元素也是“最大点”,输出498 2 2。
【评分标准】
该题要求输出二维数组的所有“最大点”,共有5个测试点。
? ? ? ? ? ?——————————————————————————————————
这个题要先把题目看懂,“多个最大点”就是一个挺大的坑。
测试的时候可以全面的考虑一下。比如:
样例输入:
3? 4
11? ?1? ? 2? ? 3
1? ? 11? ?4? ? 5
2? ? 11? ?11? 1
样例输出:
11? ?1? ?1
11? ?2? ?2
11? ?3? ?2
11? ?3? ?3
红颜色的是比较容易犯的错,要多注意细节。
#include <stdio.h> #include <stdlib.h> int main() { int m,n,i=0,j=0,k=0,max,pos,flag;//pos指找到的max的下标,flag判断是不是最大点; scanf("%d %d",&m,&n);//输入行m,列n(其实行用col表示,列用row表示更好一点); int a[m][n];//定义数组a; //输入数组; for(i=0;i<m;i++){ for(j=0;j<n;j++){ scanf("%d",&a[i][j]); } } //查找每一行的第一个最大值; for(i=0;i<m;i++){ flag=1;//flag初始化为1; max=a[i][0]; for(j=1;j<n;j++){ if(a[i][j]>max){ max=a[i][j]; pos=j; } } //判断找到的行最大值是否为列最大值; for(k=0;k<m;k++){ if(a[k][pos]>max){ flag=0;//如果所在的列出现大于该max值的数,flag为0,该数不是要找的最大点; break; } } //flag=1表示该数就是the very max,输出该max和行数列数; if(flag==1){ printf("%d %d %d\n",max,i+1,pos+1); } //下面的循环用来判断该行是否有相同的最大值,是否也是符合条件的最大点; for(j=pos+1;j<n;j++){ if(a[i][j]==max){ //由于上面已经找到了行max值,所以再次判断时看有没有等于max的就OK pos=j; flag=1;//同样初始化flag; //判断是否也是列max; for(k=0;k<m;k++){ if(a[k][pos]>max){ flag=0; break; } } //如果是最大点,输出; if(flag==1){ printf("%d %d %d\n",max,i+1,pos+1); } } } } return 0; }
代码写的不怎么好看,欢迎大家指正。
有不清楚的地方,欢迎评论留言哦。