C++实现寻找所有马鞍点

C++实现寻找所有马鞍点

实现思路

在一个矩阵中第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;
}

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

斯曦巍峨

码文不易,有条件的可以支持一下

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值