//改进算法
void fun(int a[][maxSize],int row,int col) {
int i,j,k,min,min_j,flag;
for (i=0;i<row;++i) {
min=a[i][0];
min_j=0;
for (j=0;j<col;++j)//找行最小值 {
if(a[i][j]<min_j) {
min=a[i][j];
//记录本行最小值
min_j=j;
//记录最小数列标
}
}
flag=1;
//判断最小数在列上是否为最大值
for (k=0;k<row;++k) {
if(min<a[k][min_j])//如果有一个数比行最小值大证明不是鞍点 {
flag=0;
break;
}
}
if(flag) {
printf("鞍点坐标:%d,%d且值为:",i,min_j,min);
break;
}
}
}
//此算法过于复杂,不需要记录最大行坐标数组,改进算法的行最小列最大与此相反,原理相同
#include
#include
#define maxSize 100
/**
算法思想:
找到每一行的最大值,用数组记录此时最大值坐标
根据坐标循环判断是否为此列的最小值
**/
int main() {
//构造数据
int m,n;
scanf("%d,%d",&m,&n);
int p[maxSize][maxSize];
int i,j,k;
int h_max[maxSize];
//行最大值数组
for (i=0;i<m;i++) {
for (j=0;j<n;j++) {
printf("请输入%d行%d列:\n",i,j);
scanf("%d",&p[i][j]);
}
}
for (i=0;i<m;i++) {
for (j=0;j<n;j++)
printf("%d\t",p[i][j]);
printf("\n");
}
//查找行最大值元素,将最大值的列坐标记录下来
for (i=0;i<m;i++) {
h_max[i]=0;
//先取第i行第0列为最大值
for (j=0;j<n;j++) {
if(p[i][j]>p[i][h_max[i]]) {
h_max[i]=j;
//记录行最大值的列坐标
}
}
printf("第%d行最大值为第%d列\n",i, h_max[i]);
}
//判断行最大值是否为列最小值
for (i=0;i<m;i++) {
int t = h_max[i];
int v_min = p[i][t];
int flag;
for (k=0;k<m;k++) {
if(p[k][t]>=v_min)//注意要有等号!!!
flag=1; else {
flag=0;
break;
//不是最小值立即跳出循环
}
}
if(flag==1)
printf("满足条件的是%d行%d列元素,值为%d\n",i,t,v_min);
}
}