2014-c-三-3

//改进算法
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);
    }
}