2025-03-24 学习记录--C/C++-PTA 习题7-5 找鞍点

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻

一、题目描述 ⭐️

习题7-5 找鞍点

一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。
本题要求编写程序,求一个给定的n阶方阵的鞍点。

输入格式:
输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个整数,其间以空格分隔。

输出格式:
输出在一行中按照“行下标 列下标”(下标从0开始)的格式输出鞍点的位置。如果鞍点不存在,则输出“NONE”。题目保证给出的矩阵至多存在一个鞍点。

输入样例1:

4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9

输出样例1:

2 1

输入样例2:

2
1 7
4 1

输出样例2:

NONE

二、代码(C语言)⭐️

#include <stdio.h>

int main() {
    int n;  // 定义变量n,表示矩阵的阶数
    scanf("%d", &n);  // 输入矩阵的阶数n

    int numArr[n][n];  // 定义n×n的二维数组存储矩阵
    int rowMaxArr[n];  // 存储每行的最大值
    int rowMaxColIndexArr[n];  // 存储每行最大值所在的列索引
    int cnt = 0;  // 计数器,用于记录处理的行数

    // 遍历矩阵的每一行
    for (int i = 0; i < n; i++) {
        // 初始化当前行的最大值和其列索引
        int rowMax = numArr[i][0];  // 假设当前行第一个元素是最大值
        int rowMaxColIndex = 0;  // 最大值所在的列索引初始为0

        // 遍历当前行的每一列
        for (int j = 0; j < n; j++) {
            scanf("%d", &numArr[i][j]);  // 输入矩阵元素
            // 更新当前行的最大值及其列索引
            if (numArr[i][j] >= rowMax) {
                rowMax = numArr[i][j];
                rowMaxColIndex = j;
            }
        }

        // 存储当前行的最大值及其列索引
        rowMaxColIndexArr[cnt] = rowMaxColIndex;
        rowMaxArr[cnt] = rowMax;
        cnt++;  // 处理行数加1
    }

    int count = 0;  // 鞍点计数器
    int rowIndex = 0;  // 鞍点所在行索引
    int colIndex = 0;  // 鞍点所在列索引

    // 检查每个行最大值是否是所在列的最小值(鞍点条件)
    for (int k = 0; k < cnt; k++) {
        int colMin = rowMaxArr[k];  // 初始化列最小值为当前行最大值

        // 遍历当前列的所有元素
        for (int i = 0; i < n; i++) {
            int colNum = numArr[i][rowMaxColIndexArr[k]];  // 获取当前列的元素
            if (colNum <= colMin) {
                colMin = colNum;  // 更新列最小值
            }
        }

        // 如果列最小值等于行最大值,说明找到鞍点
        if (colMin == rowMaxArr[k]) {
            count++;  // 鞍点计数加1
            rowIndex = k;  // 记录鞍点行索引
            colIndex = rowMaxColIndexArr[k];  // 记录鞍点列索引
        }
    }

    // 输出结果
    if (count == 0) {
        printf("NONE");  // 没有找到鞍点
    } else {
        printf("%d %d\n", rowIndex, colIndex);  // 输出鞍点位置
    }

    return 0;  // 程序正常结束
}

在这里插入图片描述
在这里插入图片描述

注意 📢】对于 获取输入字符串 的题目,注意 getchar(); 的合理添加:👇🏻

// 吸收数值后的换行符,防止影响下一轮输入
getchar();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小呀小萝卜儿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值