矩阵Am*n中存在某个元素aij,使得aij是第i行的最小值与第j列的最大值,则称该元素为矩阵A的鞍点
int saddle1(int A[m][n])
{
int count = 0, i, j, k;
int rowmin, colmax; // 行最小值与列最大值
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
k = 0;
while ((k < n) && (A[i][k] >= A[i][j])) // 是否是第i行最小数
k++;
if (k < n)
{
rowmin = false;
}
else
{
rowmin = true;
}
if (rowmin == true) // 是i行最小数时继续判断
{
k = 0;
while ((k < m) && (A[k][j] >= A[i][j])) // 是否是第j列最大数
k++;
if (k < m)
{
colmax = false;
}
else
{
colmax = true;
}
}
if (rowmin == true && colmax == true)
{
count++; // 鞍点计数
}
}
}
return count;
}
int saddle2(int A[m][n])
{
int count = 0, i, j,k;
int B[n], C[m]; // 每列最大数和每行最小数
for (i = 0; i < m; i++) // 求每行的最小数
{
C[i] = A[i][0];
for (j = 1; j < n; j++)
{
if (C[i] > A[i][j])
{
C[i] = A[i][j];
}
}
}
for (j = 0; j < n; j++) // 求每列最大数
{
B[j] = A[0][j];
for (i = 1; i < m; i++) {
if (B[j] < A[i][j])
{
B[j] = A[i][j];
}
}
}
// 求所有鞍点
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (C[i] == B[j])
{
count++;
}
}
}
return count;
}