找出一个二位数组的“鞍点”,即该位置上的元素在该行上最大,在该列
上最小,也可能没有鞍点。应至少准备两组数据:(1)二维数组有鞍点,如 9 80 205 40
90 60 96 1
210 3 101 89
9 8020540 90 60 196 1
210 3 101 89
45 54 156 7
用 scanf 函数从键盘输入数组各元素的值,检查结果是否正确。
#include <stdio.h>
int main() {
int m, n;
printf("请输入矩阵的行数和列数:");
scanf("%d %d", &m, &n);
// 动态分配二维数组内存
int **matrix = (int **) malloc(m * sizeof(int *));
for (int i = 0; i < m; i++) {
matrix[i] = (int *) malloc(n * sizeof(int));
}
printf("请按照顺序输入矩阵元素的值:");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
scanf("%d", &matrix[i][j]);
}
}
// 寻找鞍点
int flag = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int max_in_row = matrix[i][j];
int min_in_col = matrix[i][j];
for (int k = 0; k < n; k++) {
if (matrix[i][k] > max_in_row) {
max_in_row = matrix[i][k];
}
if (matrix[k][j] < min_in_col) {
min_in_col = matrix[k][j];
}
}
if (max_in_row == matrix[i][j] && min_in_col == matrix[i][j]) {
printf("鞍点位置为:%d,%d,值为:%d\n", i, j, matrix[i][j]);
flag = 1;
}
}
}
if(flag == 0){
printf("未找到鞍点\n");
}
// 释放二维数组内存
for (int i = 0; i < m; i++) {
free(matrix[i]);
}
free(matrix);
return 0;
}
程序中,首先通过 scanf
函数获取矩阵的行数和列数,并动态分配二维数组的内存空间,然后再通过 scanf
函数从键盘输入二维数组的各元素的值。接着,程序通过双重循环遍历二维数组,以找到鞍点,并输出该鞍点的位置和值。最后,释放二维数组的内存空间。
对于第一组数据:
9 80 205 40
90 -60 96 1
210 -3 101 89
运行程序后输出结果为:
鞍点位置为:1,2,值为:96
而对于第二组数据:
9 80 205 40
90 -60 196 1
210 -3 101 89
45 54 156 7
运行程序后,则会输出结果:
未找到鞍点
#include <iostream>
using namespace std;
const int MAX_ROW = 100, MAX_COL = 100;
// 找出二维数组的鞍点,返回行数和列数,如果没有返回0
pair<int, int> saddle_point(int a[MAX_ROW][MAX_COL], int n, int m) {
int row_min[MAX_ROW];
for (int i = 0; i < n; i++) {
int min_val = a[i][0];
for (int j = 1; j < m; j++) {
if (a[i][j] < min_val) {
min_val = a[i][j];
}
}
row_min[i] = min_val;
}
for (int j = 0; j < m; j++) {
int max_val = a[0][j];
int max_i = 0;
for (int i = 1; i < n; i++) {
if (a[i][j] > max_val) {
max_val = a[i][j];
max_i = i;
}
}
if (max_val == row_min[max_i]) {
// 找到了鞍点
return make_pair(max_i, j);
}
}
// 没有找到鞍点
return make_pair(0, 0);
}
int main() {
int n, m, a[MAX_ROW][MAX_COL];
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> a[i][j];
}
}
pair<int, int> p = saddle_point(a, n, m);
if (p.first == 0 && p.second == 0) {
cout << "没有鞍点" << endl;
} else {
cout << "鞍点坐标为:" << p.first << ", " << p.second << endl;
}
return 0;
}
这里我们使用了一个 pair
类型来存储鞍点的行数和列数,如果没有找到鞍点就返回 (0, 0)
。
然后是两组测试数据:
输入:
3 4
9 80 205 40
90 -60 96 1
210 -3 101 89
输出:
鞍点坐标为:0, 2
输入:
3 4
9 80 205 40
90 -60 196 1
210 -3 101 89
输出:
没有鞍点