题目描述:若矩阵Am*n中的某一元素A[i][j]是第i行中的最小值,同时又是第j列的最大值,则称此元素为该矩阵的一个鞍点。试编写一个算法找出一个矩阵中的鞍点,并返回他的下标(如果有的话)。
在源码注释中有我这个算法的思想的详细描述,下面是博主自己写的源码,若有错误,欢迎大家评论指出。
// ex4-12.cpp : Defines the entry point for the console application.
//这是一个找矩阵鞍点的算法,所谓的矩阵的鞍点指的是若A[i][j]是第i行的最小值,且是第j列的最大值,这A[i][j]为矩阵的一个鞍点
//我的算法思想是先找到第i行的最小值,并记录下来,本算法中是用min记录的,同时记录下它的列数minj,如后再在第minj列中找到该列的最大值max,比较
//min和max是否相等,若想等则说明A[i][j]为矩阵的一个鞍点,这样逐行检测下去,便可全部找到矩阵的鞍点,算法时间复杂度为O(i*j);
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int A[3][3]; //数组声明,这里为了简单我直接确定了数组的大小
int minj; //用于记录找到的最小值的列数
int max; //用于存储找到的第j列的最大值
int min; //用于存储找到的第i行的最小值
for (int i = 0; i < 3; i++)
{//输入矩阵函数
for (int j = 0; j < 3; j++)
{
cout << "请输入第" << i + 1 << "行、第" << j + 1 << "列元素: ";
cin >> A[i][j];
}
}
cout << "输入矩阵为下: " << endl;
for (int i = 0; i < 3; i++)
{//显示输入矩阵函数
for (int j = 0; j < 3; j++)
{
cout << A[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < 3; i++)
{//查找鞍点函数
int j = 1; //一个列数循环标记
min = A[i][0]; //最开始让该行的第一个值作为该行的最小值
minj = 0; //初始化最小值的列数为0
while (j < 3)
{
if (min < A[i][j]) //若第i行第j个大于当前min存储的值,则继续比较该行下一个值
{
j++;
}
else
{
min = A[i][j]; //若第i行第j个小于或等于当前min存储的值,则把该值赋给min值,同时记下该值的列数
minj = j; //记下当前最小值的列数
j++;
}
}
max = A[0][minj]; //把第minj列的第一个值赋给max,作为当前的最大值
int m = 1; //用来进行行数计数循环
while (m < 3)
{
if (max > A[m][minj])
{
m++;
}
else
{
max = A[m][minj];
m++;
}
}
if (max == min) //若min和max相等则输出该值的值和下标,同时继续找下一个矩阵鞍点
{
cout << "矩阵的一个鞍点为:" << max << " 下标 i = " << i << " j = " << minj << endl;
}
}
system("pause");
return 0;
}