中国大学(mooc)第7周编程练习(鞍数)(2022年)
#include<stdio.h>
int main()
{
int a[100][100];
int i,n,s,j,x,min,cnt=0,d,max,g=1;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
cnt++; //每输入四个数吸收一次换行符
if(cnt%4==0){
getchar();
}
}
}
i=0;
while(i<n){ //从第0行开始寻找符合条件的数据,找到该行的最大值后,立刻判断是否为所在列的最小值。
max=a[i][0];
for(j=0;j<n;j++){
if(a[i][j]>max){
max=a[i][j];
s=j; //寻找行最大值 ,使用s保存该值得列下标。
}
}
min=a[0][s]; //通过已找到的列下标和该行的数,寻找该列的最小值。
for(x=0;x<n;x++){
if(a[x][s]<min){
min=a[x][s];
d=x; //找到该行的最小值,使用d保存该值的行下标。
}
}
if(max==min){ //使用数值上的比较是最方便的,即使有同样大的数在该行或列,该点也是所在行或列的最大或最小值。
printf("%d %d",d,s); //判断,如果符合要求,输出该点的行和列下标。
g=0; //找到鞍点的标志
break; //根据体中要求,只存在一个鞍点,找到后,结束循环。
}
i++; //如果改行没有找到,进入下一行,重新寻找。
}
if(g==1){ //如果没有找到鞍点,输出:NO。
printf("NO");
}
return 0;
}
其实这题更多的是在考查我门对二维数组的理解,如果行和列搞错了,这道题就会相当难,虽然代码看起来不简单,但是思路却是相当的简单,首先我们要把输入的数按照正确的方式存在数组中,所以要从第0行开始,然后一步步换行,切记要处理换行的问题。
寻找鞍数也是如此,先在第0行找最大数,然后判断是不是该列的最小值,如果是,程序结束,不是则换行开始重复上步操作,如果一直没有,则输出:NO,这一步要注意的是 如何在找到最大值的所在列找最小值,还有如何判断是否找到鞍数。
当然我也曾考虑会不会在寻找列最小值的时候遇见相同的值,导致记录错了,但是仔细想,就算有也不影响该数是所在行或列的最大或最小值。
个人见解,希望对大家有所帮助。