问题描述:任意输入一个m*n(3=<m、n<=6)阶整数矩阵,设计算法输出鞍点——鞍点即本行最大,本列最小的元素。

输入形式:m n <enter>

                 m*n个整数

输出形式:none||鞍点及鞍点所在行、列整数值

样例输入:

3 3

1 1 1 

1 1 1 

1 1 1 

样例输出:none

样例输入:

3 4

1 7 4 1

4 8 3 6

1 6 1 2

样例输出:6 2 1(值6,第三行,第二列)

样例说明:本算法只考虑无鞍点或只有一个鞍点的情况。

沈航数组作业题。

判断步骤:

  1. 求本行的最大值;
  2. 如果最大值重复出现,则排除本行
  3. 已找到符合条件的行最大值点,再求其所在列最小值;
  4. 如果该点不是列最小值点,或虽是最小值但最小值重复出现,则排除此点
  5. 最后所得鞍点,其为本行唯一最大值,本列唯一最小值.

C语言代码样例:

#include <stdio.h>
#pragma warning(disable:4996)
int main() {
    int a[6][6] = { 0 }, m, n, i, j, k, max, min, flag, row, col, non = 1;
/*m,n是矩阵的行和列长度,i,j,k用于for循环,max是本行最大值,min是该列最小值,flag用于判断是否不符合条件,row和col是鞍点的行和列坐标,non判断是否无鞍点*/
    scanf("%d%d", &m, &n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &a[i][j]);
    /*读入*/
    /*
    1.求i行的最大值;
    2.如果最大值重复出现,则忽略此行;
    3.已找到符合条件的行最大值点,再求其所在列最小值;
    4.如果该点不是列最小值点,或虽是最小值但最小值重复出现,则排除此点
    5.最后所得鞍点,其为本行唯一最大值,本列唯一最小值。
    flag=1表示存在可能性,flag=0表示一定不可能,已排除。
    */
    for (i = 0; i < m; i++) {
        flag = 1; 
        max = a[i][0]; col = 0;
        //找本行最大值.由于存在负数元素的可能性,不能设max初值为0,而应该是本行第一个元素。
        for (j = 1; j < n; j++)
            if (a[i][j] > max) { max = a[i][j]; col = j; }//求行最大值
        for (j = 0; j < n; j++)
            if (a[i][j] == max && j != col) { flag = 0; break; }//第二条。
        if (flag == 0)continue;
        //至此行最大值点已找到,下面看是不是列最小值点
        min = a[0][col]; row = 0;
        for (k = 1; k < m; k++)
            if (a[k][col] < min) { min = a[k][col]; row = k; }//求列最小值
        if (max != min)continue;//第四条
        for (k = 0; k < m; k++)
            if (a[k][col] == max && k != row) { flag = 0; break; }
        if (flag == 0)continue;//第四条
        //至此仍未被淘汰的就是鞍点。
        non = 0;
        printf("%d %d %d", a[row][col], row, col);
        break;
    }
    if (non)printf("none");//无鞍点
    return 0;
}
//SAU revali3664
//仅供参考 无限进步

注:最后的输出,如果存在鞍点,第一个值为鞍点值,第二个值为鞍点所在矩阵行数-1,第三个值为鞍点所在矩阵列数-1.