10.25
求解马鞍点问题
若矩阵Anm中某个元素A[i][j]是矩阵第i行中值最小的元素,同时又是第j列中值最大的元素,则称元素A[i][j]是矩阵中的一个马鞍点。
设以二维数组存储矩阵,编写算法求矩阵A中的所有马鞍点,算法的时间复杂度要尽量的低。
注意当最大值(最小值)并列相等时,会出现多鞍点的情况。
输入格式 :
第一行输入矩阵的总行数M和总列数N,以空格间隔。
之后的M行,依次输入矩阵的各行数据,以空格间隔。
输出格式 :若有马鞍点,则以行序为主序,依次输出各个马鞍点。
每个马鞍点以(row, col, val)的形式输出,其中row 代表马鞍点的行号,col代表马鞍点的列号,val代表马鞍点的值。
若无马鞍点,则输出“NONE”。
#include <stdio.h>
#define Mmax 100
#define Nmax 100
int main()
{
int M, N;
int i, j, k, b = 0, min, t = 0;
int A[Mmax][Nmax];
int B[Nmax];
scanf("%d %d", &M, &N);
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
scanf("%d", &A[i][j]);
}
}
for (i = 0; i < M; i++)
{
min = A[i][0];
B[t] = 0;
t++;
for (j = 1; j < N; j++)
{
if (A[i][j] < min)
{
min = A[i][j];
t = 0;
B[t] = j;
t++;
}
else if (A[i][j] == min)
{
B[t] = j;
t++;
}
}
for (k = 0; k < t; k++)
{
int y, l = 0;
int x = B[k];
for (y = 0; y < M; y++)
{
if (min < A[y][x])
{
l = 1;
}
}
if (l == 0)
{
printf("(%d,%d,%d)", i + 1, x + 1, min);
b = -1;
}
}
}
if (b != -1)
{
printf("NONE");
}
}
运行结果: