在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。
思路:
找出第一行中最大的数,再找出这个数所在列的最小数。比较两数是否相同,若相同则为鞍点并输出该数(和行号和列号)并终止寻找。若第一行没找到,换下一行,操作同上。若果遍历数组的每一行都没有鞍点,则该数组无鞍点。
代码:
#includeint main(void){ int i,j,k,sign=0; //k用来代替i,内层循环也用i会使外层循环次数减少;符号变量sign判断元素是否为鞍点 int max,min; //max记录一行中的最大值;min记录一列中的最小值 int row,colum; //记下元素所在的行、列号 int N=10,M=10; int arr[N][M]; //定义一个二维数组 //获取输入数组的行、列数 printf("请输入输入数组的行数,列数:"); scanf("%d%d",&N,&M); //数据输入 printf("请输入数组:n"); for(i=0;i max){ //遍历本行所有元素,找出本行最大的元素并存入max max=arr[i][j]; colum=j; //记下最大元素的列号 } } for(k=0,j=colum,min=arr[k][j];k arr[k][j]){ //遍历本行所有元素,找出本列最小的元素并存入min min=arr[k][j]; row=k; //记下最大元素的行号 } } //判断是否为鞍点 if(min==max){ //若果一行中所有元素的最大值max也是该元素所在列中所有元素的最小值min(即鞍点)则置sign为1 sign=1;break; //如果找到了鞍点则直接跳出循环( } } //结果输出 if(sign)printf("该数组有鞍点:%d,位于行%d,列%d",max,row+1,colum+1); //若sign为1,则数组有鞍点(为防止数组中红相同元素的干扰,输出所在的行、列号) ,反之无鞍点 else printf("该数组没有鞍点"); return 0; }
1.输入以下数组:
运行结果:
2.输入以下数组:
运行结果:
存在的不足:
无法输出有多个鞍点的数组的所有鞍点,例如找如下数组的鞍点:
如上,该程序只是找出了其中的一个行数列数最小的一个鞍点。



