Paradox_277 2024-03-07 16:07 采纳率: 33.3%
浏览 1
已结题

找鞍点程序有bug(c++)

题目描述
给定一个 5×5 的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
我的思路
两个二维数组来分别记录行的最大值和列的最小值,进行标记为1,两个都是1的就是鞍点
洛谷测试点只通过了三个,不知道怎么改了,佬们帮忙看下哪里出错了
我的代码:

int main() {
    int a[5][5]; int k; int t = 0; int h[5][5] = { 0 }; int l[5][5] = { 10000 };
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 5; j++) {
            cin >> a[i][j];
            if (a[i][j] > t) {
                t = a[i][j];
                k = j;
            }
        }
        h[i][k] = 1;
        t = 0;
    }
    t = 10000000;
    for (int j = 0; j < 5; j++) {
        for (int i = 0; i < 5; i++) {
            if (a[i][j] < t) {
                t = a[i][j];
                k = i;
            }
        }
        l[k][j] = 1;
    }
    for (int j = 0; j < 5; j++) {
        for (int i = 0; i < 5; i++) {
            if ((h[j][i] == 1)&&(l[j][i]==1)) {
                cout << j + 1 << " " << i + 1 << " " << a[j][i];
                return 0;
            }
            
        }
    }
    cout << "not found";
}

  • 写回答

4条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-07 16:09
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题出在第三重循环中,判断是否为鞍点的逻辑有误。应该判断行和列中是否都有最大值和最小值而不是判断行和列的索引值是否相等。修改后的代码如下:
    int main() {
        int a[5][5];
        int k;
        int t = 0;
        int h[5][5] = {0};
        int l[5][5] = {10000};
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                cin >> a[i][j];
                if (a[i][j] > t) {
                    t = a[i][j];
                    k = j;
                }
            }
            h[i][k] = 1;
            t = 0;
        }
        t = 10000000;
        for (int j = 0; j < 5; j++) {
            for (int i = 0; i < 5; i++) {
                if (a[i][j] < t) {
                    t = a[i][j];
                    k = i;
                }
            }
            l[k][j] = 1;
            t = 10000000;
        }
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (a[i][j] == h[i][j] && a[i][j] == l[i][j]) {
                    cout << i + 1 << " " << j + 1 << " " << a[i][j];
                    return 0;
                }
            }
        }
        cout << "not found";
        return 0;
    }
    

    注意修改判断鞍点的逻辑后,第三重循环的索引也需要修改为i和j,而不是j和i。同时,为了更好的可读性,修改了代码格式以及变量命名规范。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月7日

悬赏问题

  • ¥100 现在不懂的是如何将当前的相机中的照片,作为纹理贴图,映射到扫描出的模型上
  • ¥15 目标跟踪,计算机视觉
  • ¥15 魔霸ROG7 pro,win11.息屏后会显示黑屏,如图,如何解决?(关键词-重新启动)
  • ¥15 有没有人知道这是哪里出了问题啊?要怎么改呀?
  • ¥200 C++表格文件处理-悬赏
  • ¥15 Windows Server2016本地登录失败
  • ¥15 复合卡卡号轨道写入芯片卡
  • ¥20 基于MATLAB的TDOA
  • ¥15 为啥输入字体突然变了
  • ¥20 已知坐标,换成MATLAB可以用的数据