问题描述:任意输入一个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,第三行,第二列)
样例说明:本算法只考虑无鞍点或只有一个鞍点的情况。
沈航数组作业题。
判断步骤:
- 求本行的最大值;
- 如果最大值重复出现,则排除本行
- 已找到符合条件的行最大值点,再求其所在列最小值;
- 如果该点不是列最小值点,或虽是最小值但最小值重复出现,则排除此点
- 最后所得鞍点,其为本行唯一最大值,本列唯一最小值.
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.