数据结构课后题目源码

这篇博客探讨了如何在C++中寻找矩阵的鞍点,即元素既是其所在行的最小值又是其所在列的最大值。博主分享了自己的源码实现,并邀请读者对可能存在的错误进行指正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:若矩阵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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值