题目描述
鞍点,就是指在一个矩阵元素的值在其所在行中最大,在其所在列中最小。要求编写程序求出二维数组中的鞍点。要求输入一个N*N型的二维数组,输出该矩阵数组的鞍点所在的行、列以及元素值。
输入用例
3
1 3 2
4 5 6
7 8 9
输出结果
3
解题思路
对于求解鞍点,设数组是A[N][N],思路是先求每一行的最大值:定义一个元素max1,来存取每一行元素中最大的那个,同时定义一个元素m,来存取max1对应的列下标。
然后再判断最大值是不是所在的列的最小值:对第m列的元素从0到N开始行遍历,如果有比max1还小的元素(说明max1不是这一列的最小值,并不是鞍点),就判断为false,直接跳出这层循环。如果遍历结果没有比max1还小的元素就输出它。
代码实现
#include <iostream>
using namespace std;
int main()
{
int N;
cout<<"输入N*N型矩阵的N值:";
cin>>N;
int a[N][N];
cout<<"输入矩阵元素:"<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
cin>>a[i][j];
}
int max1=0; //定义行最大
int p=0; //定义行最大时的列下标,便于对该列进行——行遍历
bool test;
for(int i=0;i<N;i++)
{
test=true; //每次外部遍历设置初始值设为true
for(int j=0;j<N;j++)
{
if(a[i][j]>max1)
{
max1=a[i][j]; //找出每行最大的数
p=j; //存取每行最大的数所在的列
}
}
for(int k=0;k<N;k++) //对每一行最大值所在的列进行遍历
{
if(a[k][p]<max1) //一旦有比max1还要小的便判断为false,并跳出
{
test=false;
break;
}
}
if(test) //判断为true即是鞍点,由于一个矩阵一般只有一个鞍点,便直接跳出外循环
{cout<<"该矩阵的鞍点在第"<<i+1<<"行,第"<<p+1<<"列,鞍点的值为"<<max1<<endl;
break;}
}
if(!test)cout<<"无鞍点!";
}