书上只有算法,我还是觉得在机子上过一遍的好。。。。。
//鞍点:aij是第i行中最小值且是第j列中的最大值,则该元素是矩阵一个鞍点。找出矩阵中的所有鞍点
//矩阵鞍点算法
#include <iostream>
using namespace std;
void saddle(int m,int n,int a[][20]);
void display(int m,int n,int a[][20]);
int main()
{
int a[20][20];
int m,n,i,j;
cin>>m>>n;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
cin>>a[i][j];
display(m,n,a);
saddle(m,n,a);//直接写a为实参,参加二维数组函数间传值方法
return 0;
}
//打印二维数组函数
void display(int m,int n,int a[][20])
{
int i,j;
for(i=0; i<m; i++)
{
for(j=0; j<n; j++)
{
cout<<a[i][j]<<"\t";
}
cout<<endl;
}
}
//鞍点:aij是第i行中最小值且是第j列中的最大值,则该元素是矩阵一个鞍点。找出矩阵中的所有鞍点
//矩阵鞍点算法
void saddle(int m,int n,int a[][20])
{
//m,n是矩阵a的行和列;
int i,j,k,p,min;
for(i=0; i<m; i++)
{
min=a[i][0];
for(j=1; j<n; j++)
if(a[i][j]<min)
min=a[i][j]; //找到每行最小值
//检测该行中的每一个最小值是否是鞍点
for(j=0; j<n; j++)
{
if(a[i][j]==min)//定位找到该最小所在位置
{
k=j;
p=0;
while(p<m&&a[p][j]<=min)//检测行最小是否是列最大,如果是,循环m次,如果不是,循环少于m次
p++;
if(p>=m)
cout<<i<<" "<<k<<" "<<min<<endl;
}
}
}
}
下面是一个4X4的矩阵示例: