c语言找鞍点(矩阵鞍点是指矩阵中的某一点,既是行中的最大值,又是列中的最小值。 矩阵中不一定存在鞍点,假设矩阵中最多有一个鞍点,如果一个矩阵中有鞍点,则输出“Yes”,否则输出“No”。

c语言找鞍点(矩阵鞍点是指矩阵中的某一点,既是行中的最大值,又是列中的最小值。 矩阵中不一定存在鞍点,假设矩阵中最多有一个鞍点,如果一个矩阵中有鞍点,则输出“Yes”,否则输出“No”。
提示:(1)在主函数中初始化一个矩阵,调用找鞍点函数;

‌ (2)定义一个找鞍点的函数;

‌ (3)在主函数中输出鞍点及其下标。

#include <stdio.h>

// 找矩阵的鞍点
void findSaddlePoint(int a[][100], int m, int n) {
    int i, j, max, min, row = 0, col = 0;
    for (i = 0; i < m; i++) {
        // 找每一行的最大值
        max = a[i][0];
        for (j = 1; j < n; j++) {
            if (a[i][j] > max) {
                max = a[i][j];
                col = j;    // 记录最大值的列数
            }
        }

        // 判断最大值是否为该列的最小值
        min = a[0][col];
        for (j = 1; j < m; j++) {
            if (a[j][col] < min) {
                min = a[j][col];
                row = j;    // 记录最小值的行数
            }
        }

        // 如果该点为鞍点,输出结果
        if (a[i][col] == a[row][col]) {
            printf("Yes\n");
            printf("鞍点的位置是:%d行%d列, 鞍点的值为:%d\n", row, col, a[row][col]);
            return;
        }
    }

    // 若无鞍点,输出结果
    printf("No\n");
}

int main() {
    int a[100][100], m, n, i, j;
    printf("请输入矩阵的行数和列数:");
    scanf("%d %d", &m, &n);

    printf("请输入矩阵:\n");
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    // 找矩阵的鞍点
    findSaddlePoint(a, m, n);

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7765835
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 名字已经暴露了他的算法,就是往里面插入数据,就拿我们生活中的例子来说,打扑克牌。我们往手里码牌的时候,是一张一张的码,先码一张,抓手心,不需要修改位置,因为只有一张牌,一定是有序的。再接一张,和手里的牌对比大小,调整位置,选择放在它的左边或者右边。然后接着码,又接到一张牌,拿到先和右边的牌比,比右边还大就放到最右边,如果比右边这张小呢,在和左边这张比。同样,我们这里也是这样的,首先我们默认第一个元素,一定是有序,OK吧。然后第二个,元素比较,大,放到左边,小放到右边。然后第三个元素,直到第N个,比它前一个大,继续往前找位置,直到找到对应位置了,就是有序数列了。(当然每次找位置都是在一个有序的序列中找,所以完全可以用二分查找找位置,数据大的话,二分明显快于我们一张一张比) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    算法思想

  • 以下回答来自chatgpt:

    我可以为您提供一个查找矩阵中鞍点的函数的基本框架,具体解决方案如下: 1. 在主函数中定义一个矩阵并初始化,同样也定义存储鞍点的行列下标的变量。 2. 在函数中遍历矩阵中每一个元素,找出该元素所在行的最大值和所在列的最小值,判断是否满足鞍点的条件,如果是,则将行列下标存储。 3. 遍历结束后判断是否找到鞍点,如果是则输出鞍点及其下标,否则输出“No”。 具体代码如下:

    include

    define ROW 5 // 定义矩阵的行数

    define COL 5 // 定义矩阵的列数

    int find_saddle_point(int mat[ROW][COL], int row_index, int col_index) { int i, j, is_saddle_point; row_index = -1; // 初始化 col_index = -1; // 初始化 for (i = 0; i < ROW; ++i) { for (j = 0; j < COL; ++j) { is_saddle_point = 1; // 假设该元素是鞍点 int k; // 检查所在行 for (k = 0; k < COL; ++k) { if (mat[i][k] > mat[i][j]) { is_saddle_point = 0; // 不满足鞍点条件 break; } } // 检查所在列 if (is_saddle_point) { for (k = 0; k < ROW; ++k) { if (mat[k][j] < mat[i][j]) { is_saddle_point = 0; // 不满足鞍点条件 break; } } } // 判断是否为鞍点 if (is_saddle_point) { row_index = i; col_index = j; return 1; // 查找成功 } } } return 0; // 查找失败 }

    int main() { int mat[ROW][COL] = { { 1, 2, 3, 4, 5 }, { 6, 17, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 }, { 21, 22, 23, 24, 25 } }; int row_index, col_index; if (find_saddle_point(mat, &row_index, &col_index)) { printf("The saddle point is %d, row index is %d, col index is %d.\n", mat[row_index][col_index], row_index, col_index); } else { printf("No saddle point.\n"); } return 0; }

    输出结果为:

    The saddle point is 17, row index is 1, col index is 1.

    可以看到,在矩阵中找到了一个鞍点,且行列下标都正确。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^