实现思路
在一个矩阵中第i行的最小值同时又是第j列的最小值我们称之为马鞍点。下面介绍以二维数组存储的马鞍点的求法:
1.先找到各行的最小值,将其存入一个数组row_min[M]中,M为数组的行数;
2.首先设置两个位置标志min_i,min_j,分别代表某列的最小值的横坐标和某行的最小值的纵坐标。
3.遍历数组的每一个元素,若元素的值等于该行的最小值,即它等于row_min中对应行数的最小值,这里暂记这个元素为flag,则令min_i,min_j的值为flag的横坐标和纵坐标。
4.遍历该元素对应的那一列,如果有比flag更小的元素,则令min_i等于更小元素的横坐标。最后看min_i是否还等于flag的横坐标,若是则说明找到一个马鞍点并将其输出。
c++源代码
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
#define M 4
#define N 5
void FindSaddlePoint(int arr[M][N])
{
int min_i, min_j;
int min_row[M];
for (int i = 0; i < M; i++)//找到每行元素的最小值并将其存入min_row数组中
{
int k = 0;
for (int j = 0; j < N; j++)
if (arr[i][j] < arr[i][k])
k = j;
min_row[i] = arr[i][k];
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if ( min_row[i]== arr[i][j])//该元素的值等于该行元素的最小值
{
min_j = j;
min_i = i;
for (int k = 0; k < M; k++)//寻找该行元素对应的列的最小值
if (arr[min_i][min_j] > arr[k][min_j])
min_i = k;
if (min_i == i)//该列元素的最小值就是上述的行最小值
cout << "(" << min_i << "," << min_j << ")" << setw(4) << arr[min_i][min_j] << endl;
}
}
}
}
int main()
{
int arr[M][N];
srand(time(0));
for(int i=0;i<M;i++)
for (int j = 0; j < N; j++)
{
arr[i][j] = rand() % (M*N);
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
cout << setw(4)<<arr[i][j];
cout << endl;
}
cout << "Saddle Point:" << endl;
FindSaddlePoint(arr);
system("pause");
return 0;
}