一本通网站1122题:计算鞍点

【题目描述】

给定一个5×5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。

例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。

c 复制代码
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25

【输入】

输入包含一个5行5列的矩阵。

【输出】

如果存在鞍点,输出鞍点所在的行、列及其值,如果不存在,输出"not found"。

【输入样例】

bash 复制代码
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25

【输出样例】

4 1 8

cpp 复制代码
#include<iostream>
using namespace std;
#include<string>
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	//创建二维数组并输入数据
	int** arr = new int* [5];
	bool flag;
	for (int i = 0; i < 5; i++)
	{
		arr[i] = new int[5];
	}
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			cin >> arr[i][j];
		}
	}
	for (int i = 0; i < 5; i++)
	{
		int max_num = arr[i][0];
		int k = 0;
		//遍历行,找出最大值及其列号
		for (int j = 0; j < 5; j++)
		{
			if (arr[i][j] > max_num) {
				max_num = arr[i][j];
				k = j;
			}
		}
		flag = true;
		//遍历列,判断该最大值是否为该列最小值
		for (int j = 0; j < 5; j++)
		{
			if (j == i) {
				continue;
			}
			if (arr[j][k] < arr[i][k]) {
				flag = false;
			}
		}
		//如果是则输出该鞍点的位置及值并结束程序
		if (flag)
		{
			cout << i + 1 << " " << k + 1 << " " << arr[i][k];
			break;
		}
	}
	//如果没有鞍点则输出"not found"
	if (!flag) {
		cout << "not found" << endl;
	}
}

题目大概的思路就是遍历每一行,找到这一行的最大值,然后记录所在的列,然后固定列,再去判断是不是这一列的最小值,然后用一个flag进行标记,最后也可以通过flag判断是否找到,如果没找到就输出not found。

我犯了两个错误:

  1. 在找最大值的时候,只顾着更新k,没有更新max_num,那么这个值就不一定是这一行的最大值
  2. 忘了判断在没有找到的时候打印not found。有时候还是需要多读几遍题目。不要漏掉了条件。
相关推荐
同学小张7 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
Yawesh_best11 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
爱学习的小邓同学11 小时前
C++ --- 多态
开发语言·c++
Ccjf酷儿13 小时前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
习习.y13 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
在逃热干面14 小时前
(笔记)自定义 systemd 服务
笔记
DKPT15 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
QT 小鲜肉17 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇
笔记·读书·孙子兵法
招摇的一半月亮17 小时前
P2242 公路维修问题
数据结构·c++·算法
星轨初途18 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法