/*
*此程序用来计算一个M行N列的矩阵的鞍点。
*矩阵的鞍点是指矩阵中的一个位置,
*该位置上的元素在其所在的行上最大、列上最小。
*一个矩阵也可能没有鞍点。
*/
#include <iostream>
using namespace std;
const int M = 3, N = 4;
//M、N分别表示矩阵的行数和列数
void loc(int a[][N], int m);
int main()
{
int a[M][N]; //矩阵的行数和列数为常量,用二维数组表示
cout << "请输入一个" << M << "×" << N << "的矩阵:" << endl;
for (int i = 0; i < M; i++) //外层循环按行移动
for (int j = 0; j < N; j++) //内层循环在每一行内按列移动
cin >> a[i][j];
//用户依次输入数组元素
loc(a, M);
return 0;
}
/*loc函数实现判断一个矩阵的鞍点的有无并输出判断结果*/
void loc(int a[][N], int m)
{
int num_of_saddle_point = 0; //num_of_saddle_point表示鞍点的总数
for (int i = 0; i < m; i++) //外层循环按行移动,i表示外层循环的循环变量
{
int index_max = 0; //将最大元素的下标index_max初始化成0
for (int j = 0; j < N; j++) //内层循环在每一行内按列移动
if (a[i][j] > a[i][index_max]) //遍历这一行中的元素,并与目前最大的元素比较
index_max = j; //更新最大元素下标
//a[i][index_max]即为矩阵第i行元素中最大的元素,如果有多个最大的元素,这是第一个
/*下面判断第i行中最大的元素是否是所在列中最小的元素*/
bool flag = true; //初始化为真
for (int t = 0; t < m; t++) //重新进行按列移动的循环,与外层循环无关,没涉及外层循环变量i
if (a[t][index_max] < a[i][index_max]) <span style="white-space:pre"> </span>//如果第i行中最大的元素所在列中有比它更小的元素
{
flag = false;
break;
}
if (flag) //条件为真说明第i行中最大的元素所在列中没有比它更小的元素
{
cout << "该矩阵的鞍点为第" << i + 1 << "行第" << index_max + 1 << "列" << endl;
num_of_saddle_point++; //鞍点的总数加1
}
/*下面考虑一行中最大的元素不唯一的情况*/
if (index_max != N - 1) //如果找到的最大元素不是所在行的最后一个元素,则需判断之后的元素
{
for (int k = index_max + 1; k < N; k++) <span style="white-space:pre"> </span>//遍历已找到的元素所在行位于其后的元素,k表示元素所在列的下标
{
if (a[i][k] == a[i][index_max]) //如果找到下一个最大元素
{
index_max = k;
bool conflag = true; //标志此元素是否为所在列中最小元素的bool变量conflag
for (int s = 0; s < m; s++)
if (a[s][index_max] < a[i][index_max])
{
conflag = false;
break;
}
//如果此元素所在列中有比它更小的元素,那么conflag为假
if (conflag) //条件为真说明此元素所在列中没有比它更小的元素
{
cout << "该矩阵的鞍点为第" << i + 1 << "行第" << k + 1 << "列" << endl;
num_of_saddle_point++; //鞍点的总数加1
}
}
}
}
}
if (num_of_saddle_point == 0) //鞍点总数为0说明该矩阵没有鞍点
cout << "该矩阵没有鞍点!" << endl;
}
矩阵的鞍点
最新推荐文章于 2023-11-27 19:37:40 发布