在矩阵中,一个数在所在行中是最大值,在所在列中是最小值,则被称为鞍点。
思路:
找出第一行中最大的数,再找出这个数所在列的最小数。比较两数是否相同,若相同则为鞍点并输出该数(和行号和列号)并终止寻找。若第一行没找到,换下一行,操作同上。若果遍历数组的每一行都没有鞍点,则该数组无鞍点。
代码:
#include<stdio.h>
int 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<N;i++){
for(j=0;j<M;j++){
scanf("%d",&arr[i][j]);
}
}
//寻找鞍点
for(i=0;i<N;i++){ //从第每一行开始
for(j=0,max=arr[i][j];j<M;j++){ //先设本行的第一个元素为该行最大的
if(arr[i][j]>max){ //遍历本行所有元素,找出本行最大的元素并存入max
max=arr[i][j];
colum=j; //记下最大元素的列号
}
}
for(k=0,j=colum,min=arr[k][j];k<N;k++){ //在最大元素的列中寻找最小值;先设本列第一个元素是最小的
if(min>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.输入以下数组:
运行结果:
存在的不足:
无法输出有多个鞍点的数组的所有鞍点,例如找如下数组的鞍点:
如上,该程序只是找出了其中的一个行数列数最小的一个鞍点。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82683.html