问题描述:若矩阵A中的某一元素A[i,j]是第I行中的最大值,而又是第j列中的最小值,则称A[i,j]为矩阵A中的一个鞍点。请写一个可确定此鞍点位置的算法(如果这个鞍点存在)。
基本要求:要求算法考虑某行中具有多个相同的且又是该行中最小的元素的情况。
实现提示:可以用一维数组R[0..n-1]保存每一行中的最小元素,用一维数组C[0..n-1]保存每一行中的最大元素。如果R[i]=C[j],则A[i,j]即为鞍点。
程序实现:可先求出每行的最小元素,放入一个数组min[m]中,再求出每一列的最大元素,放入max[n]中,若某个元素既在min[i]中,又在max[j]中,则该元素R[i][j]便是鞍点。
程序设计
#define m 3
#define n 3
#include "stdio.h"
void main()
{
int i,j,a[m][n],min[n],max[m];int t=0;
printf("按行输入元素,例:'5,'表示元素是5:\n");
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d,",&a[i][j]);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
max[i]=a[i][0];
if(a[i][j]>max[i])
max[i]=a[i][j];
}
for(j=0;j<n;j++)
for(i=0;i<m;i++)
{
min[j]=a[0][j];
if(a[i][j]<min[j])
min[j]=a[i][j];
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(max[i]==min[j])
{
t++;
printf("第%d行第%d列的%d是鞍点\n",i,j,max[i]);
}
}
if(t==0)
printf("该矩阵不存在鞍点\n");
printf("输出矩阵:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}