矩阵的鞍点

/*
*此程序用来计算一个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;
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值