二维数组找鞍点C++

题目描述

找出一个二维数组中的鞍点,即该位置上的元素在该行上最大,在该列上最小,二维数组的行列n,m以及二维数组均由键盘输入,当存在鞍点时,输出位置以及该点的值,当不存在鞍点时,输出-1
例如输入:
4 5
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
输出:
0 4 5

#include<iostream>
using namespace std;
int main() {
	int n, m;
	cin >> n >> m;
	int** a = new int* [n];
	for (int i = 0; i < n; i++) {
		a[i] = new int[m];
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}
	bool find;
	int ani = 0, anj = 0;
	for (int i = 0; i < n; i++) {
		ani = i;
		anj = 0;
		for (int j = 0; j < m; j++)
			if (a[i][j] > a[i][anj])
				anj = j;
		find = true;
		for (int k = 0; k < n; k++)
			if (a[k][anj] < a[ani][anj]) {
				find = false;
			}
		if (find) {
			break;
		}
	}
	if (find) {
		cout << ani << " " << anj << " " << a[ani][anj] << endl;
	}
	else
		cout << "-1" << endl;
	return 0;
}

二维数组中,鞍点是指一个元素在其所在行中最大的数,同时在其所在列中最小的数。换句话说,鞍点是一个元素在所在行中的最大值,同时也是在所在列中的最小值。 要鞍点,我们可以使用两个循环来遍历二维数组中的每个元素。首先,我们遍历每一行,到每一行中的最大值。然后,再遍历每一列,到每一列中的最小值。当我们到一个元素既是其所在行的最大值又是其所在列的最小值时,就到了一个鞍点。 下面是一个示例代码来二维数组鞍点: ``` def find_saddle_point(matrix): m = len(matrix) # 行数 n = len(matrix[0]) # 列数 saddle_points = [] # 存储所有的鞍点 for i in range(m): max_val = max(matrix[i]) # 到当前行的最大值 max_index = matrix[i].index(max_val) # 到最大值的索引 # 判断最大值是否也是其所在列的最小值 if max_val == min(matrix[row][max_index] for row in range(m)): saddle_points.append((i, max_index)) # 添加鞍点的坐标到列表中 return saddle_points # 测试 matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] saddle_points = find_saddle_point(matrix) if len(saddle_points) > 0: for point in saddle_points: print("鞍点坐标为:({}, {})".format(point[0], point[1])) else: print("没有鞍点") ``` 以上代码中,我们通过两个循环遍历二维数组中的所有元素。在第一个循环中,我们到了每一行的最大值,并记录了最大值所在的列索引。在第二个循环中,我们通过列表解析来到每一列的最小值,并判断最大值是否也是其所在列的最小值。如果是,则将该点的坐标添加到`saddle_points`列表中。 执行以上代码,输出的结果是: ``` 鞍点坐标为:(2, 0) ``` 这表明在给定的二维数组中存在一个鞍点,其坐标为(2, 0)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*应似飞鸿踏雪泥*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值