6. 求马鞍点问题。如果矩阵A中存在一个元素A[i][j]满足条件“A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素”,则称之为该矩阵的一个马鞍点。设计一个程序,输出m*n的矩阵A中的所有马鞍点。C++编写
时间: 2024-11-06 17:36:47 浏览: 14
如果矩阵A中存在这样的一个元素A[i][j]满足条件“A[i][j]是第i行中值最小的元素,且又是第j列中值最大的元素”,则称之为该矩阵的一个马鞍点。编写一个函数,计算出m*n的矩阵A的所有马鞍点
5星 · 资源好评率100%
在C++中,我们可以使用双层循环遍历矩阵,并在每一步检查当前元素是否满足马鞍点的条件。以下是实现这一功能的简单算法:
```cpp
#include <iostream>
#include <vector>
std::pair<int, int> findSaddlePoint(const std::vector<std::vector<int>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
std::vector<int> row_min(m), col_max(n);
// 计算每行的最小值和每列的最大值
for (int i = 0; i < m; ++i) {
row_min[i] = INT_MAX;
for (int j = 0; j < n; ++j) {
row_min[i] = std::min(row_min[i], matrix[i][j]);
}
}
for (int j = 0; j < n; ++j) {
col_max[j] = INT_MIN;
for (int i = 0; i < m; ++i) {
col_max[j] = std::max(col_max[j], matrix[i][j]);
}
}
// 找到同时是最小行值和最大列值的元素
std::vector<std::pair<int, int>> saddle_points;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == row_min[i] && matrix[i][j] == col_max[j]) {
saddle_points.push_back(std::make_pair(i, j));
}
}
}
return saddle_points.empty() ? std::make_pair(-1, -1) : saddle_points[0]; // 返回第一个马鞍点,如果没有就返回(-1,-1)
}
int main() {
std::vector<std::vector<int>> matrix = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
auto saddle_point = findSaddlePoint(matrix);
if (saddle_point.first != -1) {
std::cout << "马鞍点坐标为 (" << saddle_point.first << ", " << saddle_point.second << ")\n";
} else {
std::cout << "矩阵中没有马鞍点.\n";
}
return 0;
}
阅读全文